2012-06-26 2 views
3

Что является самым чистым, самым читаемым способом string.Format десятичного со следующими критериямиString.Format десятичного со знаком, фиксированное количество знаков после запятой, без десятичного разделителя

  • старта с символом знака (+ или -)
  • фиксированное количество знаков после запятой
  • нет десятичного разделителя
  • по правому краю
  • предварительно проложенный с «0» 's

Например

  • 123,45 станет "+0"
  • -1123,45 станет "-0112345"

ответ

6

Вы почти наверняка хотите, чтобы Custom numeric format string перешел на метод String.Format.

Строка настраиваемого формата может содержать 2 раздела (сначала для положительных, второй для отрицательного форматирования), для которых вы можете предоставить литерал + или -. Так форматировать с 7 символов нулями это что-то вроде:

String.Format("{0:'+'0000000;'-'0000000}",yourValue); 

Однако это усечение десятичную, и поэтому ваш вклад дает

123.45 --> +000
-1123.45 --> -0001123 

Одно простое решение просто умножьте число на 100 (чтобы зафиксировать число десятичных цифр до 2) перед передачей его в вышеприведенном

Живой пример: http://rextester.com/SZR8690 (C# - извините, но только демо это идея)

Это может быть затем завернутые в метод расширения:

<Extension()> 
Public Function ToFixedFormat(ByVal value As Decimal, ByVal numFractionalDigits As Integer) 
    Return String.Format("{0:'+'0000000;'-'0000000}",value * Math.Pow(10,numFractionalDigits)) 
End Function 

Живой пример: http://rextester.com/LSAAA60214 (VB.NET)

+0

Не волнуйтесь, я свободно в C# тоже;) Умножая: простой и гениальной :) –

+0

@BorisCallens - я думал, что C# будет в порядке, но мы всегда должны стремиться предоставить примеры кода на выбранном вами языке. Фиксированное количество цифр было единственной частью 'String.Format' can not do (не в любом случае без разделителя с десятичной запятой). Таким образом, ваши 2 варианта заменяют десятичное место (в соответствии с ответом Тима) или умножаются на n-ю степень 10 (как за мой ответ). – Jamiec

3

Может быть, есть что-то лучше, потому что это выглядит немного неуклюжим, но он работает.

Я указываю положительный и отрицательный формат, чтобы обеспечить знак плюса для положительных чисел и строку фиксированного размера. Затем я использую InvariantCulture для обеспечения того, чтобы точка разделилась как десятичный разделитель (я мог бы использовать и другие культуры). Последний шаг - удалить точку.

Dim value = -1123.45 
Dim formatted = value.ToString(
     "+00000.00;-00000.00", 
     System.Globalization.CultureInfo.InvariantCulture) 
formatted = formatted.Replace(".", "") 

Как вы можете видеть, я не знаю, как не указывать не десятичного разделителя.

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