2013-07-16 5 views
2

Я ищу для String.Format() спецификатора в .NET Framework, который позволит это:String.Format для конкретного случая использования

- Для значений в диапазоне от 0 до 1, ведущего числа (0 или 1), десятичный разделитель и три цифры после, например. 0,995, 1,000, 0,015

- в диапазоне от 0 до 100, два десятичных разряда: 0,00, 5,46, 10,0

- в диапазоне от 100 до 10000, без каких-либо знаков после запятой: 543, 886, 2576

По существу, мне кажется, нужны четыре значащие цифры, где десятичные знаки появляются только в том случае, если число очень мало. Ни один из моих выходов не имеет отрицательных значений. EDIT: Мне нужно избегать научной нотации.

Есть ли спецификатор формата, который может дать мне что-то близкое к этому? Или, альтернативно, регулярное выражение, которое будет модифицировать строку с двойной точностью (например, «43667.73625003946255») для ее создания?

+0

Немного nitpick, но только для того, чтобы убедиться: мы должны просто идти по вашим примерам? Четыре значащие цифры приведут к 0.9950 и 10.00 и т. Д. Ваши примеры имеют различное количество значимых цифр. –

+1

Вы используете _need_ одну строку формата или можете ли вы реализовать ее в пользовательском 'IFormatProvider'? –

+0

Да, по моим примерам. Для разных диапазонов требуются разные значащие цифры. Я бы хотел, чтобы он был в единственном формате, если это возможно; Передние концы XAML будут использовать его, и я хотел бы указать форматирование в синтаксисе привязки. Если привязки могут указывать 'IFormatProvider', я буду использовать это, хотя! –

ответ

1

doubeValue.ToString("g3") предоставит вам текстовое представление с 3 значащими цифрами.

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

0.57464.ToString("g3") //---> 0.575 
1234.ToString("g3") //---> 1.23e+03 
13.ToString("g3") //---> 13 
string.Format("{0:g3}", 999) //---> 999 
string.Format("{0:g3}", 0.000324) //---> 0.000324 
+0

Мне нужно избегать научной нотации –

3

Я не думаю, что вы найдете одну строку в формате, который даст вам те результаты, но вот обычай IFormatProvider, который должен работать:

public class CustomFormatter : IFormatProvider, ICustomFormatter 
{ 
    public string Format(string format, object arg, IFormatProvider formatProvider) 
    { 
     if(IsNumber(arg)) 
     { 
      double number = Convert.ToDouble(arg); 
      if(number < 1) 
       return string.Format("{0:0.000}", arg); 
      else if(number < 10) 
       return string.Format("{0:0.00}", arg); 
      return string.Format("{0:0}", arg); 
     } 
     else return string.Format(format,arg); // default formatting for other types 
    } 

    public object GetFormat(Type formatType) 
    { 
    return (formatType == typeof(ICustomFormatter)) ? this : null; 
    } 

    public static bool IsNumber(object value) 
    { 
     return value is sbyte 
       || value is byte 
       || value is short 
       || value is ushort 
       || value is int 
       || value is uint 
       || value is long 
       || value is ulong 
       || value is float 
       || value is double 
       || value is decimal; 
    } 
} 

void Main() 
{ 
    foreach(object val in (new object[] {0, 0.05, 1, 1.0, 1.5, 9.9, 10, 10m,0XFF})) 
     Console.WriteLine(val + " : "+string.Format(new CustomFormatter(),"{0}",val)); 
} 

выход:

0 : 0.000 
0.05 : 0.050 
1 : 1.00 
1.0 : 1.00 
1.5 : 1.50 
9.9 : 9.90 
10 : 10 
10m : 10 
255 : 255 
+1

Дарн избил меня. – Romoku

0

Я бы применил простой способ продления:

public static class DoubleExtensions { 
    public static string ToCustomString(this double value) { 
     var absValue = Math.Abs(value); 
     if (absValue < 1) 
      return string.Format("{0:N3}", value); 
     if (absValue < 100) 
      return string.Format("{0:N2}", value); 
     return string.Format("{0:N0}", value); 
    } 
} 
Смежные вопросы