Zero55 Posted March 9, 2015 Posted March 9, 2015 Hoe kan ik testen of de laatste 4 karakters in een tekstveld getallen zijn ? De getallen kunnen willekeurig zijn... Quote
0 Infomatics Posted March 9, 2015 Posted March 9, 2015 op verschillende manieren; right(tekst;4)*1 > 0 filter(right(;4) ;"01234567890") <> "" of zo Quote
0 PJ007 Posted March 9, 2015 Posted March 9, 2015 Als ik de vraagsteller goed begrepen heb, gaat het er om dat dat de laatste 4 karakters allemaal een getal moeten zijn. Bij de tot nu toe genoemde oplossingen geeft bijv. "abcd12b4" een resultaat dat waar is en dat klopt dus niet. Het volgende werkt wel. Daarnaast wordt er ook nog op minimaal 4 karakters getest. filter ( right ( tekst ; 4 ) ; "0123456789" ) = Right ( tekst ; 4 ) and length ( tekst ) > 3 Quote
0 Zero55 Posted March 9, 2015 Author Posted March 9, 2015 inderdaad, laatste 4 karakter moeten allen een getal zijn. Merci voor de oplossingen !! Quote
0 Zero55 Posted March 10, 2015 Author Posted March 10, 2015 en wat als ik een getallenreeks zoek bestaande uit 8 willekeurige getallen op een willekeurige plaats in een tekstveld ? welke functie moet ik dan gebruiken ? ik vermoed dat "right" niet meer zal lukken... Quote
0 Zero55 Posted March 11, 2015 Author Posted March 11, 2015 @Felix, dat had ik al geprobeerd, maar werkt blijkbaar niet... als de getallenreeks op het einde van het tekstveld staat krijg ik wel een "1" return (dit staat bvb in het tekstveld : "ksjhdbksdbsbd 87654321 dfhjbkhgbsfg", de uitkomst zou dus "87654321" moeten zijn) Quote
0 Zero55 Posted March 11, 2015 Author Posted March 11, 2015 heb mijn velden eens opnieuw aangemaakt en ingesteld... nu krijg ik een "1" al dan niet een "0" return ifv het bestaan van de getallenreeks. maar hoe krijg ik nu die getallenreeks in een veld ? Quote
0 Zero55 Posted March 11, 2015 Author Posted March 11, 2015 tuurlijk, met de Let-functie wat ik nu wel opmerk is dat als er meerdere getallenreeksen voorkomen in de tekst (bvb "ajhsdjsh 123 jshdvjhsdvf 12345678 hsbdhdbv) de formule niet werkt... klopt dat ? Quote
0 menno Posted March 11, 2015 Posted March 11, 2015 Het lijkt erop dat je wilt checken óf je een getalreeks van 8 getallen in een veld hebt staan. In dat geval kan je (met fmpro-advanced) ook een custom-function gebruiken: ## CF_GetalReeks ( Data ; Lengte ) Let ( [ v = Substitute ( Data ; [ " " ; ¶ ] ) ; n = ValueCount ( v ) ; c = GetValue ( v ; 1 ) ; l = Length ( c ) ; c2 = Filter ( c ; "0123456789" ) ; l2 = Length ( c2 ) ] ; Case ( l = Lengte and l2 = Lengte ; c ; n > 0 ; CF_GetalReeks ( MiddleValues ( v ; 2 ; n - 1 ) ; Lengte ) ) ) Zodra er een waarde wordt gevonden die uit een getalreeks van de opgegeven lengte verschijnt, dan exit de functie met de waarde die is gevonden. De functie geeft dan bij CF_GetalReeks ( "Test met tekst en getallen: 01235 is te kort getal 45645647 is lang genoeg en hier nog een getal 89123645 dat niet wordt getoond" ; 8 ) 45645647 als resultaat, de eerste getalreeks van 8 cijfers Quote
0 Zero55 Posted March 11, 2015 Author Posted March 11, 2015 menno, dat was inderdaad de bedoeling ! trouwens de eerste keer dat ik een custom-function heb gebruikt ik begrijp wel gedeeltelijk wat je doet... enige is als er zoals je zegt 2 getallenreeksen van 8 zijn, waar bepaal je welke getallenreeks de functie neemt ? Quote
0 menno Posted March 11, 2015 Posted March 11, 2015 In het Case-gedeelte wordt bepaald wat er gebeurt; in dit geval wordt zodra er een waarde wordt gevonden die aan de voorwaarden voldoet, gestopt met uitvoeren. Maar dat kan je zelf naar hartelust aanpassen ... kwestie van ff goed nadenken wat je precies voor resultaat van een berekening vraagt. Quote
0 menno Posted March 12, 2015 Posted March 12, 2015 Als je de case-statement een klein beetje uitbreidt en: Case ( l = Lengte and l2 = Lengte ; c ; n > 0 ; CF_GetalReeks ( MiddleValues ( v ; 2 ; n - 1 ) ; Lengte ) ) verandert in: List ( If ( l = Lengte and l2 = Lengte ; c ) ; If ( n > 0 ; CF_GetalReeks ( MiddleValues ( v ; 2 ; n - 1 ) ; Lengte ) ) ) dus je maakt er een List() van de 2 delen van de Case() dan is de uitkomst een list van alle waarden die voldoen aan de voorwaarde van 8 cijfers lengte: 45645647 89123645 Quote
0 menno Posted March 16, 2015 Posted March 16, 2015 Ik heb nog eens zitten knutselen naar aanleiding van jouw vraag hoe nu eigenlijk wordt bepaald welke waarde wordt gefilterd. Daarbij kwam ik een paar leuke issues tegen: Je kan meer dan één reeks van een bepaalde lengte in een string hebben. Een reeks van die bepaalde lengte kan opgesloten zitten in tekst, dwz kan zonder spaties ergens tussen staan In die gevallen kan je de eerste willen hebben Je kan de laatste willen hebben Je kan ze allemaal willen hebben (een specifieke daaruit, de derde oid zou je met een GetValue() daar weer uit kunnen halen) Ik wilde niet nog een extra CF maken waar je van afhankelijk zou zijn, dus ik wilde een autonome functie verzinnen Als deze issues heb ik kunnen tackelen met de volgende functie: CF_GetalReeks_2 ( Data ; Lengte ; Type ) Waarbij de Data en Lengte identiek zijn aan die in de vorige uitvoering van deze CF, in Type mag 0,1 of 2 worden ingevuld, waarbij: 0 = de eerste geldige aaneengesloten getalreeks 1 = de laatse geldige en 2 = alle geldige getalreeksen If ( Data ≠ Filter ( Data ; "0123456789 ¶" ) ; Let ( [ v1 = Data ; n1 = Length ( v1 ) ; x1 = Left ( Filter ( Left ( v1 ; 1 ) ; "0123456789 ¶" ) & " " ; 1 ) ; x2 = x1 & CF_GetalReeks_2 ( Middle ( v1 ; 2 ; n1 - 1 ) ; Lengte ; Type ) ] ; If ( Data ≠ Filter ( Data ; "0123456789 ¶" ) ; x2 ; CF_GetalReeks_2 ( x2 ; Lengte ; Type ) ) ) ; Let ( [ r = Case ( Type = 1 ; 0 ; Type = 2 ; 1 ; 1 ) ; v = Substitute ( Data ; [ " " ; ¶ ] ) ; n = ValueCount ( v ) ; c = GetValue ( v ; If ( r = 1 ; 1 ; n ) ) ; l = Length ( c ) ; c2 = Filter ( c ; "0123456789" ) ; l2 = Length ( c2 ) ] ; Case ( Type = 2 ; List ( If ( l = Lengte and l2 = Lengte ; c ) ; If ( n > 0 ; CF_GetalReeks_2 ( MiddleValues ( v ; 2 ; n - 1 ) ; Lengte ; Type ) ) ) ; l = Lengte and l2 = Lengte ; c ; n > 0 ; CF_GetalReeks_2 ( MiddleValues ( v ; 1 + r ; n - 1 ) ; Lengte ; Type ) ) ) ) De functie moet recursief worden gebruikt, omdat bij de eerste doorgang alle overbodige tekst wordt vervangen door spaties. Daarna moet het resultaat nogmaals met dezelfde functie worden bewerkt voor het juiste eindresultaat. De reden voor deze werkwijze is om getalreeksen te kunnen vinden die niet vrij in de tekst staan zoals test01234567test. Zou dit absoluut niet gebeuren, dan kan je de functie voor een deel strippen en is de recursie niet nodig. (Voor nu doe ik dus maar even moeilijk) Het gebruik is nu bijna net zo eenvoudig als met de vorige CF, alleen moet je hem "nesten": CF_GetalReeks_2 ( CF_GetalReeks_2 ( Data ; Lengte ; 2 ) ; Lengte ; Type ) Een voorbeeld is altijd handig, dus nemen we de volgende tekst: 01235 is een kort getal 45645647 is langer en hier nog een getal89123641opgesloten in wat extra tekst En ook bij deze string willen we weer alleen een aaneengesloten getalreeks van 8 cijfers hebben.Zoals je ziet staan er twee in. De functie wordt dan als volgt gebruikt: CF_GetalReeks_2 ( CF_GetalReeks_2 ( "01235 is een kort getal 45645647 is langer en hier nog een getal89123641opgesloten in wat extra tekst" ; 8 ; 2 ) ; 8 ; 0 ) Deze formule levert bij de eerste doorgang 01235 45645647 89123641 Dit is nu alleen maar de tekst gestript van alle niet numerieke gegevens behalve (een flink aantal) spaties en in de tweede doorgang wordt dan: CF_GetalReeks_2 ( "01235 45645647 89123641" ; 8 ; 0 ) geëvalueerd en wordt de eerste waarde van 8 cijfers: 45645647 teruggegeven; Type 1 (laatste) geeft 89123641 en Type 2 (alles) geeft 45645647 89123641 Het valt je wellicht op dat in de binnenste aanroep voor Type = 2 (alles) is gekozen. Als je nu een string hebt die al alleen maar uit getallen en spaties zou bestaan en je zou bij type een 1 invullen en je wilt de eerste of alle waarden hebben, dan klopt je uitkomst niet, want het filterdeel van de functie wordt dan overgeslagen en dus is het handig om in de eerste doorloop altijd alle (geldige) waarden door te laten. Waarom al deze moeite? Gewoon omdat het af en toe leuk is om even hard na te denken Quote
0 hans erik Posted March 17, 2015 Posted March 17, 2015 Mooi! Wel jammer dat er niet gewoon een loopmogelijkheid is binnen de LET functie. Je schrijft toch een klein programmaatje en ik vind in zo'n geval recursion altijd slecht toegankelijk als methode voor repeterende calculaties. Het is vaak moeilijk te doorgronden wat er precies gebeurt. Quote
0 andries Posted March 17, 2015 Posted March 17, 2015 Kijk eens naar customList, die functie is een loop binnen een functie die intern gebruik maakt van Let en Evaluate. Tot 20 000 iteraties is het gelimiteerd (maar dat zit hem enkel in de code, je kan die er ook weer uithalen)/ Zo kan je dan bijvoorbeeld: Let ( $list = List ( 1 ; 2 ; 3 ; 4 ) ; CustomList ( 1 ; ValueCount ( $list ) ; "GetValue ( $list ; [n] ) + 1" ) ) En dat geeft als resultaat: 2¶3¶4¶5 ps: ook nog eens performanter dan de recursie methode van FileMaker Quote
Question
Zero55
Hoe kan ik testen of de laatste 4 karakters in een tekstveld getallen zijn ?
De getallen kunnen willekeurig zijn...
20 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.