webForumDet fria alternativet

ta bort bokstäver ur sträng

ASP

19 svar · 781 visningar · startad av ShoGun

Medlem sedan aug. 2002237 inlägg
Frågan#1

har en sträng som kan innehålla både siffror och text
tex. a="w2e3m"

nu vill jag ändra så att alla bokstäver tas bort.
tex. så skulle ovanstående bli a="23"

Medlem sedan okt. 20005 273 inlägg
#2

Jag vet inte hur avancerat du vill ha det. men jag skulle nog vilja ge dig denna länk:
http://www.webeye.nu/default2.asp?que=asp/default.asp&exec=asp/artiklar/asp_11.asp
Där går Vide igenom Regular Exp. på ett mycket smidigt sätt, och om inte du vill/kan lära dig ¨nått av den artikeln så kommer det säkert upp några förslag hur du får bort dina bokstäver ur din string.

mvh icaaq

Medlem sedan aug. 2002237 inlägg
#3

får syntax error på Set objRegExp = New regexp

Medlem sedan aug. 20021 752 inlägg
#4

Om det bara är korta stängar så är det nog lättare att bara göra en loop som går igenom hela strängen och flyttar över alla siffror från strängen till en temporär sträng och när loopen är klar så sätts strängen lika med den temporära strängen.

/Viktor

Medlem sedan aug. 2002237 inlägg
#5

skulle du kunna ge ett kod exempel viktor?

Medlem sedan aug. 20021 752 inlägg
#6

Har inte VB installerat så jag kan inte prova koden men något sånthär borde fungera

dim str as string
dim tmp as string
dim i as integer
str = "w2e3m"
tmp=""
for i=0 to str.length
  if IsNumeric(mid(str,i,1)) then
    tmp=tmp+mid(str,i,1)
  end if
next i
str=tmp

Jag är lite osäker på hur man kollar längden på en sträng så str.length kanske inte fungerar.

/Viktor

Medlem sedan dec. 2000557 inlägg
#7

Jag löste det på detta sätt.. :)

<%
  
a = "w2e3m"
iA = Len(a)
  
For i = 1 To iA
	If IsNumeric(Left(a,1)) Then
		intNumeric = intNumeric & Left(a,1)
		a = right(a, iA-i)
	Else
		strText = strText & Left(a,1)
		a = right(a, iA-i)
	End If
Next
  
Response.Write ""&_
"Bokstäver: "& strText &"<br>"&_
"Siffror: "& intNumeric 
 
%>
Medlem sedan maj 200115 inlägg
#8

Hej allihop..
Jag har ett liknande problem. Min sida är så här:

  1. Användaren väljer en "kompetens" klickar på nästa.
  2. Sökning ska ske i databasen efter alla personer som har den kompetensen
  3. Resultatet ska visas på skärmen i form av en matris

Problem

  1. Varje person kan ha flera kompetenser har för tillfället avgränsat dom så att en ";" står mellan varje kompetens i databsen
  2. När användaren klickar på "skicka" så skickas ett tal, ingen text som "alla" ger exempel på. (Vet inte om det spelar nån roll)

Problem so far:
Jag kollade den sidan som icaaq skrev, skitbra sida, jag använder den koden men... :q

  1. Hur gör jag för att få sökningen att inkludera alla personer i databasen och inte den första? antalet personer i databasen är X

  2. Hur gör jag med avgränsaren, om Nisse har kompetens 1;2;6
    så ska han vara med i matrisen, om användaren söker på kompetens 2.

Riktig amatör fråga eller hur, om man förstår vad jag menar alltså. :r

Koden jag använder för tillfället

KompString = request("komp")
myString = ObjPersoner("Kompetenser")

Set objRegExp = New regexp
objRegExp.Global = true
objRegExp.IgnoreCase = false
objRegExp.Pattern = KompString
Set myMatches = objRegExp.Execute(myString)

Response.Write "Hittade "&myMatches.Count&"st träff(ar)<br><br>"

For each item in myMatches
  Response.Write "Hittade en träff vid position "&item.FirstIndex&", som är "&item.Length&" tecken lång. Värdet är <b>"&item.Value&"</b><br>"

Next

Tack i förhand

Medlem sedan dec. 200012 464 inlägg
#9

Problem

  1. Varje person kan ha flera kompetenser har för tillfället avgränsat dom så att en ";" står mellan varje kompetens i databsen

Du har rätt i att detta är problemet. Det är helt fel datamodell för att lagra flera attribut för en användare.

Skapa en till tabell med två kolumner

create table userCompetence(userid int, comptenceId int)

lagra varje kombination av userid/CompetenceId som en post i denna tabell. Dvs, om userid 4711 har kompetenserna 1,2 och 6
så blir det tre poster i tabellen.

För att hitta alla användare med en viss kompetens.

q = "select * from users where userid in (select userid from userCompetence where competenceId = " & request.form("competence") & ")"
Medlem sedan maj 200115 inlägg
#10

Det underlättar ju mitt arbete mycket om jag gör som du säger LarsG, men är det det "bästa" sätter att göra det.

Jag vet inte, det låter som en lång sökning för oss människor, men kanske är rena barnleken för datorn.

Jag strävar efter perfektion :e

Medlem sedan dec. 200012 464 inlägg
#11

Det är mycket effektivare. Om man bara har ett värde i varje kolumn så kan man använda index för sökningen,dvs man kan direkt hitta de poster som är relevanta. Med den design du har så måste databashanteraren läsa alla poster.

Medlem sedan maj 200115 inlägg
#12

Tack för hjälpen LarsG, det funkar super nu!!
Men nu behöver jag mer hjälp, riktig nybörjar hjälp :D

Finn fem fel

<%
DIM KompString, ObjHeader
KompString = Request("UnderGrupp")
IF KompString = "" THEN
response.redirect "index2.asp?Error"
ELSE
HeaderString = "Select * FROM Header WHERE KompetensID =" & KompString
SET ObjHeader = Server.CreateObject("ADODB.RecordSet")
ObjHeader.Open HeaderString, objConn

'JAG VET ATT DETTA ÄR FEL.
ForetagsString = "Select * FROM Companys WHERE ForetagsID =" & ObjHeader("ForetagsID")
SET ObjForetag = Server.CreateObject("ADODB.RecordSet")
ObjForetag.Open ForetagsString, ObjConn%>

<TABLE BORDER=1 CELLSPACING=3 cellpadding="3">
<TR><TD>FöretagsNamn</TD><TD>Adress</TD><TD>Representant</TD><TD>Epost</TD><TD>Telefon</TD><TD>Fax</TD><TD>Hemsida</TD></TR>
<TR >
<%
DO WHILE NOT objHeader.EOF
IF NOT objHeader.EOF THEN%>
<TD><FONT SIZE=-1><%response.write ObjForetag("ForetagsNamn")%></TD>
<TD><FONT SIZE=-1><%IF ObjForetag("Adress1") = "" THEN response.write "Uppgifter saknas" ELSE response.write ObjForetag("Adress1") END IF%><BR>
	<%IF ObjForetag("Adress2") = "" THEN response.write "Uppgifter saknas" ELSE response.write ObjForetag("Adress2") END IF%></TD>
<TD><FONT SIZE=-1><%IF ObjForetag("Representant") = "" THEN response.write "Uppgifter saknas" ELSE response.write ObjForetag("Representant")END IF%></TD>
<TD><FONT SIZE=-1><%IF ObjForetag("Epost") = "" THEN response.write "Uppgifter saknas" ELSE response.write "<A HREF=mailto:" & ObjForetag("Epost") &">" & ObjForetag("Epost") &" </A>"END IF%></TD>
<TD><FONT SIZE=-1><%IF ObjForetag("Telefon") = "" THEN response.write "Uppgifter saknas" ELSE response.write ObjForetag("Telefon") END IF%></TD>
<TD><FONT SIZE=-1><%IF ObjForetag("Fax") = "" THEN response.write "Uppgifter saknas" ELSE response.write ObjForetag("Fax") END IF%></TD>
<TD><FONT SIZE=-1><%IF ObjForetag("Hemsida") = " " THEN response.write "Uppgifter saknas" ELSE response.write "<A HREF =" & ObjForetag("Hemsida") &">"& ObjForetag("ForetagsNamn") & "</A></TD>" END IF
response.write "</TR>"
objHeader.MOVENEXT
END IF
LOOP
END IF%>
</TABLE>

:r Den fyller i listan en gång sen hoppar den ur loopen, när det fortfarande inte är EOF vad gör jag fel. Samt andra småfel kan också föras fram till ljuset

2½ frågor kvar
Varför funkar inte IF satsen i loopen? När hemsida saknas så skriver den företagsnamnet, men hänvisar till samma sida, den ska ju skriva "uppgifter saknas"

<%IF ObjForetag("Hemsida") = " " THEN response.write "Uppgifter saknas" ELSE response.write "<A HREF =" & ObjForetag("Hemsida") &">"& ObjForetag("ForetagsNamn") & "</A></TD>" END IF

Och finns det inget man kan skriva som typ (Svensk översättning) "Om någon av cellerna är tomma, skriv 'uppgift saknas'"
istället för att jag skriver en massa if satser

Detta är mer en HTML fråga
Finns det inget annat sätt att ändra på fontstorleken förutom det sätt som jag har gjort? Kan nada CSS btw (kodexempel skulle vara väldigt bra)

Och försök hålla svaren så nära svenskan som möjligt, eftersom jag är fortfarande en "n00b" :birp

Medlem sedan mars 20015 287 inlägg
#13

Ang. hemsidefältet är det nog eftersom du jämför med ett blanksteg där, ta bort mellan rummet:

IF ObjForetag("Hemsida") = ""

eller kanske bättre:

IF ObjForetag("Hemsida") <> ""
Medlem sedan mars 20015 287 inlägg
#14

Den fyller i listan en gång sen hoppar den ur loopen...

Är den inte slut? Vilket rs syftar du på egentligen? Det är väl bara den första posten från ObjHeader("ForetagsID") du får fram. Du måste flytta in den sql-frågan i loopen för att få fram flera poster.

Men egentligen är det väl fel att göra så där, ska till en join och plocka ut allt i en sql-fråga skulle jag tro. (Som de lärda lär visa dig.)

Medlem sedan maj 200115 inlägg
#15

Solbulle:
IF satsen funkar inte. Det spelar ingen roll om jag skriver "", " " eller <> "", den skriver ändå inte uppgift saknas. Temporärt så har jag satt

IF objforetag("Hemsida") = "." Then response.write "Uppgift saknas" else ... END IF

Jag har alltså skrivit in en punkt för varje ställe i databsen där det fattas uppgifter.

Vad jag menade med den hoppar ur loopen är att om det finns två personer (A och B) som har kompetens ABC så visas bara person A
Alltså istället för att skriva:
Person:Kompetens:X:Y:Z
A:ABC:X:Y:Z
B:ABC:X:Y:Z

så skriver den
A:ABC:X:Y:Z
A:ABC:X:Y:Z

förstår du vad jag menar nu med att den "hoppar ut ur loopen"
Den visar bara första personen i listan med rätt kompetens, om det finns 20 personer med samma kompetens visas den första personen 20 gånger

Medlem sedan mars 20015 287 inlägg
#16

Jo... när du kör denna:

HeaderString = "Select * FROM Header WHERE KompetensID =" & KompString

Får du kanske 20 träffar, sen kör du denna:

ForetagsString = "Select * FROM Companys WHERE ForetagsID =" & ObjHeader("ForetagsID")

Men problemet, som jag ser det, är att du kör den med den första träffen av ObjHeader("ForetagsID").
Senare loopar du 20 gånger men du ändrar ju aldrig ObjHeader("ForetagsID"). Mao måste du ha in den sql-frågan i loopen. Tror jag...

Typ:

<%
DIM KompString, ObjHeader
KompString = Request("UnderGrupp")
IF KompString = "" THEN
response.redirect "index2.asp?Error"
ELSE
HeaderString = "Select * FROM Header WHERE KompetensID =" & KompString
SET ObjHeader = Server.CreateObject("ADODB.RecordSet")
ObjHeader.Open HeaderString, objConn

DO WHILE NOT objHeader.EOF
IF NOT objHeader.EOF THEN
'JAG VET ATT DETTA ÄR FEL.
ForetagsString = "Select * FROM Companys WHERE ForetagsID =" & ObjHeader("ForetagsID")
SET ObjForetag = Server.CreateObject("ADODB.RecordSet")
ObjForetag.Open ForetagsString, ObjConn%>

<TABLE BORDER=1 CELLSPACING=3 cellpadding="3">
<TR><TD>FöretagsNamn</TD><TD>Adress</TD><TD>Representant</TD><TD>Epost</TD><TD>Telefon</TD><TD>Fax</TD><TD>Hemsida</TD></TR>
<TR >

<TD><FONT SIZE=-1><%response.write ObjForetag("ForetagsNamn")%></TD>
<TD><FONT SIZE=-1><%IF ObjForetag("Adress1") = "" THEN response.write "Uppgifter saknas" ELSE response.write ObjForetag("Adress1") END IF%><BR>
	<%IF ObjForetag("Adress2") = "" THEN response.write "Uppgifter saknas" ELSE response.write ObjForetag("Adress2") END IF%></TD>
<TD><FONT SIZE=-1><%IF ObjForetag("Representant") = "" THEN response.write "Uppgifter saknas" ELSE response.write ObjForetag("Representant")END IF%></TD>
<TD><FONT SIZE=-1><%IF ObjForetag("Epost") = "" THEN response.write "Uppgifter saknas" ELSE response.write "<A HREF=mailto:" & ObjForetag("Epost") &">" & ObjForetag("Epost") &" </A>"END IF%></TD>
<TD><FONT SIZE=-1><%IF ObjForetag("Telefon") = "" THEN response.write "Uppgifter saknas" ELSE response.write ObjForetag("Telefon") END IF%></TD>
<TD><FONT SIZE=-1><%IF ObjForetag("Fax") = "" THEN response.write "Uppgifter saknas" ELSE response.write ObjForetag("Fax") END IF%></TD>
<TD><FONT SIZE=-1><%IF ObjForetag("Hemsida") = " " THEN response.write "Uppgifter saknas" ELSE response.write "<A HREF =" & ObjForetag("Hemsida") &">"& ObjForetag("ForetagsNamn") & "</A></TD>" END IF
response.write "</TR>"
objHeader.MOVENEXT
END IF
LOOP
END IF%>
</TABLE>

Fast det är inte rätt sätt att lösa det på.

Medlem sedan maj 200115 inlägg
#17

Det låter vettigt :stud
Fast öppnas också inte 20 kopplingar till databsen så som du har skrivit det eftersom du har med

SET ObjForetag = Server.CreateObject("ADODB.RecordSet")
ObjForetag.Open ForetagsString, ObjConn%>

i loopen?

Medlem sedan maj 200115 inlägg
#18

TACK SOLBULLE!!!!

Jag har suttit i två dagar med det här problemet så fixar du det. ett stort tack ska du ha (Och ni andra också självklart :D)

Men frågan återstår.. skapas det inte en massa kopplingar till databasen om man har

SET ObjForetag = Server.CreateObject("ADODB.RecordSet")
ObjForetag.Open ForetagsString, ObjConn%>

med i loopen?

:P

Medlem sedan mars 20015 287 inlägg
#19

Fast det är inte rätt sätt att lösa det på.

Men egentligen är det väl fel att göra så där, ska till en join och plocka ut allt i en sql-fråga skulle jag tro. (Som de lärda lär visa dig.)

Jo precis, det är det som sker och det är verkligen inte bra, du skulle behöva en join istället men det är över min förmåga, men det var i alla fall det som var fel ;)

Får se om LarsG eller någon av de tyngre elefanterna behagar dansa in och fixa till det hela åt dig.

Medlem sedan maj 200115 inlägg
#20

Kan vi få in några tyngre elefanter att komma in här, dansande föredras, och hjälpa mig? :birp

280 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
133 ms — deklarationer (db)
0 ms — hämta statistik (cache)
145 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)