2013-03-27 14 views
7

Jest to prawdopodobnie głupi, ale daje mi to trudny czas. Muszę przekonwertować/sformatować double na string z obowiązkowym punktem dziesiętnym.Podwójny ciąg znaków z obowiązkowym miejscem dziesiętnym

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

Zasadniczo, chcę wyjściu wszystkie dziesiętne ale również upewnić się, że wartości zaokrąglone posiadają redundantne .0 też. Jestem pewien, że istnieje prosty sposób, aby to osiągnąć.

+0

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

+0

Nie jestem jest teraz odpowiedzią, ponieważ nie jestem w stanie tego przetestować, ale nie można sformatować za pomocą "0." " – Sayse

+0

Dzięki, ale nie do końca. Spróbuj '(1.234) .ToString (" f ")'. Wydaje się, że zaokrągla się dokładnie do dwóch miejsc po przecinku. – wpfwannabe

Odpowiedz

4

Nie ma wbudowanej metody dołączania obowiązkowego .0 na końcu całych liczb przy użyciu metody .ToString(), ponieważ istniejące formaty zostaną ucięte lub zaokrąglone w oparciu o określoną liczbę miejsc dziesiętnych.

Moja propozycja jest po prostu toczyć własną implementację z metodę rozszerzenia

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

} 

a użycie:

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()); 

wyniki w tej produkcji:

1.0 
0.2423423 
0.1 
1234.0 
+0

Mimo że użyłem własnego rozwiązania, lubię tę odpowiedź dla całkowitej prostoty. Dzięki wszystkim! – wpfwannabe

7

Zastosowanie 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

Aktualizacja

(1,234) .ToString („N1”) daje 1,2 a oprócz usuwania dodatkowych cyfr dziesiętnych, dodaje także separator tysięcy

No, może trzeba zaimplementować niestandardową NumberFormatInfo przedmiot, który można wynikają z bieżącej CultureInfo i stosowania w double.ToString:

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

Pamiętaj, że musisz sklonować go, ponieważ jest to tylko do odczytu domyślnie.

Demo

+0

+1 za odpowiedź i powiadomienie mnie o Ideone.com :) – floAr

+2

'(1.234) .ToString ("N1") 'produkuje' 1.2' – wpfwannabe

+2

Oprócz usuwania dodatkowych cyfr dziesiętnych, dodaje także separator tysięcy, którego nie zawiera przykład OP. – CodesInChaos

-1

można rzutować na ciąg i następnie Appen jeśli nie było sensu dziesiętny dane”0,0"

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

EDIT: '' Jak wspomniano w komentarzach nie może być separatorem dziesiętnym w obecnej kulturze. Zapoznaj się z numerem this article, aby pobrać rzeczywisty separator, jeśli chcesz zapisać kod w tym przypadku.

+0

Ten jest uszkodzony w ustawieniach regionalnych z kropkami dziesiętnymi innymi niż ".". Jest też dość brzydka. – CodesInChaos

0

Double zapewnia metodę ToString(), w której można przekazać IFormatProvider -obiekt określający, w jaki sposób chcesz przekonwertować swoją double.

Dodatkowo powinien wyświetlać końcowy numer 0 za wszelką cenę.

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 jest dokumentacja z MSDN.

3

Można zrobić coś takiego: jeśli liczba nie ma przecinków dziesiętnych, można sformatować jej wynik, aby wymusić jedną cyfrę dziesiętną 0, a jeśli ma miejsca dziesiętne, wystarczy użyć 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"); 

Podczas korzystania "F" jak formatowanie, wyjście nie będzie zawierać tysiące separator oraz numer, który następuje to określa liczbę miejsc po przecinku.

+0

Cholera, wiem, że mogę robić różne sztuczki. Miałem nadzieję, że przeoczyłem coś oczywistego, jak 1.234.ToString ("coś tutaj"). – wpfwannabe