Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Luvun erotus merkkijonosta (VB6)

Sivun loppuun

Aku2 [29.11.2004 00:59:00]

#

Ongelmani on yhden rivin trimmauksessa.

Rivi, josta pitäisi trimmata on muotoa:
1.1.2004 blaa, blaa 12345

Käytän trimmauksessa seuraavanlaista riviä.
Label3.Caption = Mid$(rr, 19, Len(rr) - 1)

Ongelmani on, että jos rivillä päivämäärä muuttaa muotoaan, esim. 12.12.2004, niin trimmauksessa käytetty luku 19 ei pidä enää paikkaansa.
Eli trimmauksesta pitäisi aina saada luku 12345 (joka on muuttuva) talteen.
Itselläni ei ole vaikutusmahdollisuutta vaikuttaa tuon päivämäärän esitysmuotoon, joten en voi sitä muuttaa esim. muotoon 01.01.2004, jolloin trimmaus onnistuisi aina.

Onko keinoja tehdä trimmaus aina oikein?

Esim voisiko tuossa trimmauksessa määrittää esim siten, että ennen tuota lukua 12345 olisi joku merkkijono, jonka jälkeinen trimmataan, jolloin päivämäärällä ei olisi vaikutusta missä muodossa se milloinkin on.
Esim rivi menisi näin.

1.1.2004 koe 12345
Josta napataan koe aloitusjonoksi, jonka jälkeinen luku 12345 luetaan muistiin joka myös näytetään. Kuinka tuo onnistuisi vai onnistuuko? Näin siis päivämäärällä ei ole merkitystä eikä aiheuta ongelmia.

Metabolix [29.11.2004 01:13:01]

#

Vilkaise InStr-funktiota. Lisäksi voit hyödyntää For-silmukkaa, jonka avulla saat etsittyä tietyn merkin (tarkistat, onko kohdassa X tietty merkki. Jos ei, siirryt seuraavaan X:ään).

esakom [29.11.2004 15:15:18]

#

onko tuo luku 12345 aina viiden numeron suuruinen? Jos on voisit kai käyttää right$(rr, 5) joka ottaa viisi merkkiä oikealta puolelta.
Jos ei ole kiinteän mittainen, niin kuten Metabolix sanoi niin for-silmukalla voi tutkia aina tarkemmin. Voisit esimerkiksi lähteä lukemaan riviä merkki kerrallaan oikealta ja tutkia onko luettu merkki numero (IsNumeric-funktio) ja/tai jatkaa niin kauan kunnes saadaan esim, välilyönti.

hunajavohveli [29.11.2004 16:48:37]

#

Jooh, jos tuolla rivillä ei tule välilyöntejä ennen kohtien "1.1.2004" ja "blaa, blaa" väliä, niin etsi tuolla funktiolla välilyönnin kohta, ja lue siitä eteen/taaksepäin.

Aku2 [30.11.2004 00:06:25]

#

esakom kirjoitti:

onko tuo luku 12345 aina viiden numeron suuruinen? Jos on voisit kai käyttää right$(rr, 5) joka ottaa viisi merkkiä oikealta puolelta..

Yleensä se on ollut viiden numeron suuruinen, mutta ei välttämättä aina.
Tuo InStr on vähän sitä suuntaa jota haen, mutta tarvisin ihan konkreettisen koodiesimerkin, kun nämä trimmaushommat ei oikein ole minun lajini.

Rivi, josta pitäisi lukea on tämän muotoinen: (esimerkkirivi)
30.11.2004 Hintaarvio 12,4556

Eli koodissa voisi olla avainsanana Hintaarvio, joka etsitään ja jonka jälkeen kaikki luetaan muuttujaan.
Millainen koodirivi tuollaisesta pitäisi tehdä?

BadSource [30.11.2004 06:14:07]

#

Osan haku:

Private Function HaeLoppu(Mista As String, MinkaJalkeen As String) As String
    HaeLoppu = Mid(Mista, (InStr(1, Mista, MinkaJalkeen) + Len(MinkaJalkeen) + 1), Len(Mista))
End Function

Testaukseen:

Private Sub Command1_Click()
    Dim Rivi As String

    Rivi = "30.11.2004 Hinta-arvio 12,4556"
    MsgBox HaeLoppu(Rivi, "Hinta-arvio")
End Sub

sqwiik [30.11.2004 07:44:49]

#

BadSource: Tuossahan on vielä se ongelma, kun Aku2 ei tiedä myöskään sitä tunnistetta (sinulla hinta-arvio). Eikö kaikkein yksinkertaisin olisi funktio split (jos käytössä on VB)?

Private Sub Command1_Click()
  String data() As String
  'Poistetaan turhat spacet päistä pois...
  Rivi = Trim(Rivi)
  'Jaetaan rivi (näin saadaan erilleen päivämäärä, tunnus ja ID)
  data = Split(Rivi, " ") 'erottimena " " eli väli
  ' Nyt data(0) on päivämäärä, data(1) on avainsana ja
  ' data(2) on haettava luku
  MsgBox data(2)
End Sub

Muista sitten myös testata taulukon koko, jos rivillä ilmenee virheellinen muoto.

BadSource [30.11.2004 09:33:40]

#

Tuo sqwiik:n ehdottama splitti toimii varmasti parhaiten tässä tapauksessa: kaikki tiedot saadaan omiin tiedettyihin muuttujiinsa. Oma ehdotukseni toimii vain, jos tunniste on tarkasti tiedossa.

Aku2 [01.12.2004 00:11:13]

#

BadSource kirjoitti:

Tuo sqwiik:n ehdottama splitti toimii varmasti parhaiten tässä tapauksessa: kaikki tiedot saadaan omiin tiedettyihin muuttujiinsa. Oma ehdotukseni toimii vain, jos tunniste on tarkasti tiedossa.

Kiitos esimerkeistä.
Tunniste on tarkasti tiedossa, joka ei tule muuttumaan.

En ole noita vielä kokeillut, mutta enköhän noilla pääse eteenpäin.

Tuossa sqwiikin esimerkissä heittää punaiseksi rivin:
String data() As String
Piti varmaan olla Dim, eikä String alkuinen :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta