2016-08-08 2 views
1

Objective-C: Я хочу удалить все нули, которые следят и ведут за некоторыми исключениями. Например:Обрезать все нули до и после десятичного знака 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 

То, что я пытался что-то вроде этого [.0]+$|(^0+). Но это не помогает, чего я пытаюсь достичь. Я использую NSString с RegularExpressionSearch следующим образом:

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

Любая помощь будет оценена.

+0

Что относительно '500'? Или '-1000'? '.50'? Вы просто хотите учесть все возможные ведущие/завершающие нули? –

+2

Зачем использовать регулярное выражение? Просто преобразуйте строку в число и вернитесь к строке? – rmaddy

+1

Или попробуйте ['"^(0) + (? = \\.) |^0 + (? = [1-9]) | \\. 0 + $ | (\\. \\ d *?) 0 + $ "'] (https://regex101.com/r/xN8dN6/1) заменить на $ 1 $ 2. Или сгруппированный: [''^(? :(0) + (? = \\.) | 0 + (? = [1-9])) | (?: \\. 0+ | (\\. \\ d *?) 0 +) $ "'] (https://regex101.com/r/xN8dN6/2) –

ответ

2

Иногда лучше разбить задачи, попробуйте их в порядке с запасной чередой @"" каждый раз:

  1. @"^0+(?!\\.)" - начальная последовательностью 0-х не с последующей точкой , Это позволит обрезать «003,0» до «3,0» и «000,3» до «0,3».

  2. @"(?<!\\.)0+$" - следящая последовательность нулей не претерпела точка. Таким образом, «3,400» переходит в «3,4» и «3,000» переходит в «3,0»

  3. @\\.0$ - удалить конечный «.0». Первые два RE могут оставить вас с «.0» нарочно, чтобы вы могли удалить точку на этом шаге.

Это не единственный способ разорвать его, но три основные задачи, чтобы удалить начальные нули, удалить конечные нули и очистки. Вам также не нужно использовать REs, простой конечный конечный автомат может быть хорошо подходит.

Важное замечание: Вышеприведенное предполагает, что строка содержит десятичную точку, если она может и не понадобиться для обработки (слева как упражнение).

HTH

+1

Хорошее предложение разбить проблему на понятные, проверяемые части - шесть месяцев назад, теперь я очень ценю такие вещи! –

+0

Как кажется, это хорошая практика, теперь я перехожу к ответу Wiktor для одного регулярного выражения. т. е. попробуйте «^ (0) + (? = \\.) |^0 + (? = [1-9]) | \\. 0 + $ | (\\. \\ d *?) 0+ $ ", чтобы заменить на $ 1 $ 2. Или сгруппированный: ''^(? :(0) + (? = \\.) | 0 + (? = [1-9])) | (?: \\. 0+ | (\\. \ \ d *?) 0 +) $ "' – Harsh

-1

что-то вроде этого?

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, потому что? –