2016-08-08 53 views
1

Objective-C: Ich möchte alle Nullen, die mit einigen Ausnahmen Trail und führen. Zum Beispiel:Trim alle Nullstellen vor und nach dem Dezimal Regex

0.05000 -> 0.05 
000.2300 -> 0.23 
005.0 -> 5 
500.0 -> 500 
60.0000 -> 60 
56.200000 -> 56.2 
56.04000 -> 56.04 

Was habe ich versucht, ist so etwas wie dieses [.0]+$|(^0+). Aber es hilft nicht, was ich zu erreichen versuche. Ich verwende NSString mit RegularExpressionSearch wie folgt:

NSString *cleaned = [someString stringByReplacingOccurrencesOfString:@"[.0]+$|(^0+)" 
                      withString:@"" 
                       options:NSRegularExpressionSearch 
                       range:NSMakeRange(0, self.doseTextField.text.length)]; 

Jede Hilfe wäre willkommen.

+0

Was ist mit '500'? Oder '-1000'? '.50'? Möchten Sie nur mögliche führende/abschließende Nullen berücksichtigen? –

+2

Warum eine Regex verwenden? Einfach die Zeichenfolge in eine Zahl und zurück in eine Zeichenfolge konvertieren? – rmaddy

+1

Oder versuchen Sie ['"^(0) + (? = \\.) |^0 + (? = [1-9]) | \\. 0 + $ | (\\. \\ d *?) 0 + $ "'] (https://regex101.com/r/xN8dN6/1) durch '$ 1 $ 2' ersetzen. Oder eine gruppierte: ['"^(? :(0) + (? = \\.) | 0 + (? = [1-9])) | (?: \\. 0+ | (\\. \\ d *?) 0 +) $ "'] (https://regex101.com/r/xN8dN6/2) –

Antwort

2

Manchmal ist es am besten, Aufgaben zu brechen, versuchen Sie diese, um mit einer Ersatz-Kette von @"" jedes Mal: ​​

  1. @"^0+(?!\\.)" - eine anfängliche Folge von 0'en nicht gefolgt von einem Punkt . Dadurch werden "003.0" auf "3.0" und "000.3" auf "0.3" getrimmt.

  2. @"(?<!\\.)0+$" - eine Folge von Nullen nicht vor einem Punkt. Also "3.400" geht zu "3.4" und "3.000" geht zu "3.0"

  3. @\\.0$ - entfernen Sie ein abschließendes ".0". Die ersten zwei REs können Sie mit ".0" absichtlich verlassen, so dass Sie dann den Punkt in diesem Schritt entfernen können. Diese

ist nicht der einzige Weg, es zu brechen, aber die drei grundlegenden Aufgaben sind führende Nullen zu entfernen, entfernen Sie nachfolgende Nullen und Bereinigung. Sie brauchen auch keine REs zu verwenden, ein einfacher Finite-State-Rechner passt vielleicht gut.

Wichtig: Obiges geht davon aus, dass die Zeichenkette ein Dezimalzeichen enthält, wenn Sie es möglicherweise nicht benötigen (auch als Übung).

HTH

+1

Guter Vorschlag, um das Problem in verständliche, testbare Teile zu zerlegen - sechs Monate später schätzt ich diese Art von Sache sehr! –

+0

Da dies eine gute Übung zu sein scheint, gehe ich jetzt mit Wiktors Antwort für eine einzelne Zeile Regex. Dh Oder probiere '"^(0) + (? = \\.) |^0 + (? = [1-9]) | \\. 0 + $ | (\\. \ d *?) 0+ $ "' durch '$ 1 $ 2' ersetzen. Oder eine gruppierte: '"^(? :(0) + (? = \\.) | 0 + (? = [1-9])) | (?: \\. 0+ | (\\. \ \ d *?) 0 +) $ "' – Harsh

-1

so etwas wie das?

let numberStrings = [ 
    "0.05000", 
    "000.2300", 
    "005.0", 
    "500.0", 
    "60.0000", 
    "56.200000", 
    "56.04000" 
] 

print(numberStrings.map({ 
    String(Double($0)!).stringByReplacingOccurrencesOfString("\\.0*$", withString: "", options: .RegularExpressionSearch, range: nil) 
})) 
+0

hmm ... downvoted weil? –