2009-07-09 2 views
4

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

 
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; 
+0

Удалено, так как вопрос существенно изменился с оригинала. –

+1

Решение проблемы должно быть найдено на SO для проблемы вопросов «Барбапапа» (т.е. вопросы, которые совершенно разные через несколько часов после того, как исходный был опубликован) –

ответ

7

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

var newStr = Regex.Replace(input, "0+$",String.Empty); 
+1

+1 - Исходный вопрос и отредактированный - это совершенно разные вопросы , Ты не заслужил ни единого голоса. –

0
([0]+)\b 

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

+0

+1 - Оригинальный вопрос vs.редактируемые - совершенно разные вопросы. Ты не заслужил ни единого голоса. –

+0

Это одна из проблем с SO. –

+1

в моем ограниченном опыте '.' считается символом границы слова, что делает эту реализацию удалением нуля перед точкой. – Victor

16

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

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

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

И так как вы добавили .NET тег в то же время, вот код:

string replaced = Regex.Replace(
         inputString, 
         @"(?<=\.\d+?)0+(?=\D|$)", 
         String.Empty); 
+0

Это должно сработать. Отличная работа. –

+0

Downvoters: пожалуйста, объясните –

+0

Я проверил все номера образцов с помощью функции «Заменить» в http://regexhero.net/, и ваше регулярное выражение работает отлично. –

-1

Одно предостережение на выше RegEx и дифферента() ... если ваш вход не имеет десятичную вы могли бы получить неправильные цифры. Например, ("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, есть, скорее всего, более простой способ сделать это.)

-1

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

(?<=\.\d*)(0+)(?=[^.\d]) 
+1

Потому что он не решает вопрос. спрашивающий просил что-то, что он сделал это: 11645766,560000001000 -> +11645766,560000001 10190045,740000000000 -> 10190045,74 +1455720,820000000100 -> +1455720,8200000001 По данным регулятора, ваш делает это: +11645766,560000001000 -> 0,560000001000 10190045,740000000000 -> +0,740000000000 1455720.820000000100 -> –

+0

Это имеет смысл. :) – MyItchyChin

Смежные вопросы