2013-03-27 24 views
7

Это, наверное, немой, но мне очень тяжело. Мне нужно преобразовать/форматировать double в string с обязательной десятичной точкой.Двойная строка с обязательной десятичной точкой

1   => 1.0 
0.2423423 => 0.2423423 
0.1  => 0.1 
1234  => 1234.0 

В принципе, я хочу, чтобы вывести все десятичные, но и убедитесь, закругленные значения имеют избыточную .0 тоже. Я уверен, что есть простой способ добиться этого.

+0

['.ToString (" N1 ");'] (http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx) – Romoku

+0

Я не являюсь в качестве ответа прямо сейчас, поскольку я не смог проверить это, но не могу отформатировать с '" 0. # "' – Sayse

+0

Спасибо, но не совсем правильно. Попробуйте '(1.234). ToString (" f ")'. Кажется, он округляется до двух десятичных знаков. – wpfwannabe

ответ

4

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

Мое предложение просто свернуть свою собственную реализацию с помощью метода расширения

public static String ToDecmialString(this double source) 
{ 
    if ((source % 1) == 0) 
     return source.ToString("f1"); 
    else 
     return source.ToString(); 

} 

И использование:

double d1 = 1; 
double d2 = 0.2423423; 
double d3 = 0.1; 
double d4 = 1234; 
Console.WriteLine(d1.ToDecimalString()); 
Console.WriteLine(d2.ToDecimalString()); 
Console.WriteLine(d3.ToDecimalString()); 
Console.WriteLine(d4.ToDecimalString()); 

Результаты в этом выводе:

1.0 
0.2423423 
0.1 
1234.0 
+0

Несмотря на то, что я использовал собственное созданное решение, мне нравится этот ответ для полной простоты. Спасибо всем! – wpfwannabe

7

Использование double.ToString("N1"):

double d1 = 1d; 
double d2 = 0.2423423d; 
double d3 = 0.1d; 
double d4 = 1234d; 
Console.WriteLine(d1.ToString("N1")); 
Console.WriteLine(d2.ToString("N1")); 
Console.WriteLine(d3.ToString("N1")); 
Console.WriteLine(d4.ToString("N1")); 

Demo

Standard Numeric Format Strings

The Numeric ("N") Format Specifier

Update

(1,234) .ToString («N1») производит 1.2 и в дополнение к удалению дополнительных десятичных цифр, то также добавляет разделитель тысяч

Ну, возможно, вам нужно реализовать собственный NumberFormatInfo объект, который вы можете вывести из текущего CultureInfo и использования в double.ToString:

var culture = CultureInfo.CurrentCulture; 
var customNfi = (NumberFormatInfo)culture.NumberFormat.Clone(); 
customNfi.NumberDecimalDigits = 1; 
customNfi.NumberGroupSeparator = ""; 
Console.WriteLine(d1.ToString(customNfi)); 

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

Demo

+0

+1 для ответа и предоставления информации о Ideone.com :) – floAr

+2

'(1.234) .ToString ("N1") 'производит' 1.2' – wpfwannabe

+2

В дополнение к удалению дополнительных десятичных цифр он также добавляет разделитель тысяч, который пример OP не содержит. – CodesInChaos

-1

Вы можете бросить в строку, а затем Appen»+0,0" , если было не дано не десятичной точки

string sValue=doubleValue.ToString(); 
if(!sValue.Contains('.')) 
    sValue+=".0"; 

EDIT:„“ Как уже упоминалось в комментариях может не быть десятичным разделителем в текущей культуре. Обратитесь к this article, чтобы получить фактический разделитель, если вы хотите сохранить свой код для этого случая.

+0

Этот файл разбит на локали с десятичными точками, отличными от '.'. Это тоже довольно уродливо. – CodesInChaos

0

Двойной обеспечивает метод ToString(), где вы можете передать IFormatProvider -объект, указав, как вы хотите, чтобы ваш double был преобразован.

Кроме того, она должна быть отображена конечная 0 любой ценой.

value = 16034.125E21; 
// Display value using the invariant culture. 
Console.WriteLine(value.ToString(CultureInfo.InvariantCulture)); 
// Display value using the en-GB culture. 
Console.WriteLine(value.ToString(CultureInfo.CreateSpecificCulture("en-GB"))); 
// Display value using the de-DE culture. 
Console.WriteLine(value.ToString(CultureInfo.CreateSpecificCulture("de-DE"))); 
// This example displays the following output to the console: 
//  -16325.62015 
//  -16325.62015 
//  -16325,62015 
//  1.6034125E+25 
//  1.6034125E+25 
//  1,6034125E+25 

Here - это документация из MSDN.

3

Вы можете сделать что-то вроде этого: если число не имеет десятичных точек, вы можете отформатировать его вывод, чтобы применить один десятичный символ 0, и если он имеет десятичные знаки, просто используйте ToString();

double a1 = 1; 
double a2 = 0.2423423; 
string result = string.Empty; 
if(a1 - Math.Floor(a1) >0.0) 
     result = a1.ToString();  
else 
     result = a1.ToString("F1"); 

if (a2 - Math.Floor(a2) > 0.0) 
     result = a2.ToString(); 
else 
     result = a2.ToString("F1"); 

При использовании "F" форматирования, выход не будет содержать разделитель тысяч и число, которое следует за ним определяет количество знаков после запятой.

+0

Черт, я знаю, что могу делать различные трюки. Я надеялся, что я пропустил нечто очевидное, как 1.234.ToString («что-то здесь»). – wpfwannabe

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