Регулярное выражение для удаления нулей - PullRequest
4 голосов
/ 09 июля 2009

Я ищу регулярное выражение (.NET) для удаления конечных нулей:

11645766.560000001000   ->  11645766.560000001
10190045.740000000000   ->  10190045.74
1455720.820000000100    ->  1455720.8200000001  

и т.д ...

<ч /> Я использую регулярное выражение вместо String.Trim (), потому что числа находятся в одной строке, фактический пример:

!BEGIN !>>C85.18 POS_LEVEL.T129{11645766.560000001000} = POS_LEVEL.T129 {10190045.740000000000} + WORK_LEVEL.T129{1455720.820000000100} END;

необходимо преобразовать в:

!BEGIN !>>C85.18 POS_LEVEL.T129{11645766.560000001} = POS_LEVEL.T129{10190045.74} + WORK_LEVEL.T129{1455720.8200000001} END;

Ответы [ 5 ]

16 голосов
/ 09 июля 2009

Если числа встроены в случайную строку, регулярные выражения - это путь:

Заменить (?<=\.\d+?)0+(?=\D|$) пустой строкой

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

И поскольку вы тем временем добавили тег .NET, вот код:

string replaced = Regex.Replace(
                         inputString,
                         @"(?<=\.\d+?)0+(?=\D|$)",
                         String.Empty);
8 голосов
/ 09 июля 2009

В .Net вы можете сделать следующее

var newStr = Regex.Replace(input, "0+$",String.Empty);
0 голосов
/ 09 июля 2009

Следующие элементы будут соответствовать нулям, которые следуют за десятичной точкой и любым количеством десятичных знаков, и которые не предшествуют десятичной точке или цифре.

(?<=\.\d*)(0+)(?=[^.\d])
0 голосов
/ 09 июля 2009

Одно предостережение о вышеупомянутых RegEx и Trim () ... если ваш ввод НЕ имеет десятичной точки, вы можете получить неправильные числа. Например, ("1000"). TrimEnd ('0') = 1.

Этот обходной путь исправит эту проблему:

string Trimmed = (Untrimmed.IndexOf('.')>=0) ? Untrimmed.TrimEnd('0') : Untrimmed;

Конечно, использование "." для десятичных чисел специфична культура - некоторые культуры используют запятые. Если вы пытаетесь встроить понимание культуры, вам нужно использовать System.Threading.Thread.CurrentThread.CurrentCulture.NumberDecimalSeparator вместо литерала '.' характер.

Редактировать: Исходя из вашего отредактированного вопроса выше, RegEx является правильным ответом. Что-то вроде:

Trimmed = RegEx.Replace(Untrimmed, "(\d\.\d*[1-9])0+([^\d]|$)", "$1$2");

([1-9] выше - мой ленивый способ избежать \ d жадности и захвата нулей, вероятно, есть более простой способ сделать это.)

0 голосов
/ 09 июля 2009
([0]+)\b

затем удалите $ 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...