3 eksempler på at fjerne foranstillede nuller

Nogle af jer husker måske dette indlæg om at tilføje foranstillede nuller til tal, f.eks. husnumre.

Men man kan jo også have behov for det modsatte, altså at fjerne foranstillede nuller, f.eks. i et husnummer.

Vi bider denne op i tre bider, så kan I selv vurderer hvilken, der skal bruges i jeres tilfælde.

1. Rene tal

Du kan have tal med foranstillede nuller, hvor der i strengen ikke forekommer andre tegn end tal.

Det er klart den nemmeste og løses med dette simple udtryk via Tabel > Opdater kolonne:

Udtryk:

Val(HUS_NR)

hvor HUS_NR er din kolonne med foranstillede nuller.

Funktionen Val() læser de numeriske tegn fra venstre mod højre og slutter, når med læsningen, når der ikke er flere numeriske tegn. Finder den nuller før andre tegn, ignoreres disse – medmindre den støder på et decimalkomma i form af et punktum (.).

2. Tal efterfulgt af et af bogstaverne A-Z

Det kan også være lidt mere besværligt, f.eks. hvis teksten også kan afsluttes med et af bogstaverne fra A-Z.

I så fald kan man ikke nøjes med at anvende den rene Val() funktion eftersom bogstavet i disse tilfælde bare ignoreres. Vi er med andre ord nødsaget til at undersøge om det sidste tegn er et bogstav mellem A og Z.

Det man man dog nemt gøre ved at spørge på om bogstavets ASCII-værdi er mellem ASCII-værdien af “A” og ASCII-værdien af “Z”. Vi sørger lige for at bogstavet er STORT, inden vi sammenligner da ASCII-værdien for “a” og “A” er forskellige.

Via Tabel > Opdater kolonne vælger du Udtryk og skriver nedenstående simple udtryk:

Udtryk:

Val(HUS_NR)
+ Right$(HUS_NR, (1 * Int(Asc(Right$(UCase$(HUS_NR), 1))
Between Asc("A") And Asc("Z")))

hvor HUS_NR er din kolonne med foranstillede nuller.

Funktionen Right$() læser et givent antal tegn fra højre i en tekststreng. Her læser vi tegnet yderst til højre.

Funktionen Int() omdanner en værdi til et heltal. I vores tilfælde omdanner vi TRUE/SANDT eller FALSE/FALSK til henholdsvis 1 eller 0. Denne værdi gange vi med 1 for enten at læse tegnet yderst til højre eller ikke læse det.

Funktionen Asc() returner ASCII-værdien af et tegn.

UCase$() omdanner teksten i en tekststreng til store bogstaver.

Operatoreren “Between And” kan bruges til at undersøge om et tal findes mellem to værdier, begge inklusive.

3. Tal efterfulgt af et af bogstaverne A -Å

Og det bliver endnu mere besværligt, hvis teksten ikke kun kan blive afsluttet af et af bogstaverne fra A-Z men også de danske tegn: Æ, Ø eller Å.

Vi bruger ovenstående metode 2, men vi er nødt til at udvide den med en test på om bogstaverne måske er et af de danske tegn. Æ, Ø og Å ligger ikke lige efter Z, når man kigger på deres ASCII-værdier, så vi er nødt til at håndtere disse særskilt.

Udtryk:

Val(HUS_NR)
+ Right$(HUS_NR, (1 * Int(Asc(Right$(UCase$(HUS_NR), 1))
Between Asc("A") And Asc("Z")
Or Right$(UCase$(HUS_NR), 1) In ("Æ", "Ø", "Å"))))

Operatoeren In () kan bruges til at undersøge om en given værdi findes i en liste af værdier.

Læs mere om ovenstående funktioner og operatorer i MapBasic Referencemanualen.

Peter

3 Responses to “3 eksempler på at fjerne foranstillede nuller”


  • Eller Val(Husnummer)+ Right$(Husnummer,Asc(Right$(Husnummer,1))\65)

  • Ups, ovenstående virker ikke med æøå eller ÆØÅ

  • Peter Horsbøll Møller

    Hej Søren

    Smart ide at bruge \ til at beregne hvor mange gange 65 går op i ASCII værdien.
    Men som du selv fandt ud af, så vil den vel fejle for ASCII-værdier over 130

    \ laver en heltalsdivision og “smider” resten over højre skulder. Resultatet er altså blot et heltal, som angiver hvor mange gange et tal går op i et andet. 5 \ 2 er f.eks. 2.

    Peter

Leave a Reply


+ 4 = 11