2016-08-12 18 views
5

muszę przekonwertować liczbę dziesiętną na ciąg b folowing:C# Konwersja przecinku ciąg z określenia formatu

  • b musi być rajem '.' charakter. Np
    • A = 12 -> B = "12,0"
    • a = 1,2 -> B = "1.2"
    • a = 1,234 -> B = "1,234"

Jak mogę to zrobić za pomocą 1 polecenia?

  • b musi mieć dokładnie 10 znaków. Np
    • A = 101 -> B = "101,000000"
    • a = 1,234 -> B = "1,23400000"
    • a = 1,234567891 -> B = "1,23456789"

(samo pytanie z 1)

+1

Wiesz, jak google (szukaj)? Zrób to najpierw, zanim zadasz pytania. –

Odpowiedz

3
decimal a = 12; 
var b = a.ToString("N1"); // 12.0 

a = 1.2m; 
b = a.ToString(); // 1.2 

a = 101m; 
b = a.ToString("N10"); // 101.0000000000 

a = 1.234m; 
b = a.ToString("N10"); // 1.2340000000 

Dla drugiej części pytania - gdzie chcesz łączną długość 10 następnie:

decimal a = 1.234567891m; 
int numberOfDigits = ((int)a).ToString().Length; 
var b = a.ToString($"N{9 - numberOfDigits}"); //1.23456789 

//Or before C# 6.0 
var b = a.ToString("N" + (9 - numberOfDigits)); //1.23456789 

Zasadniczo ((int)number).ToString().Length daje ilość cyfr przed . (konwersja int usunięcie frakcji) i następnie redukcję, że z szeregu cyfr po . (a także -1 samego miejsca po przecinku)

+0

W drugim pytaniu całkowita liczba znaków b wynosi 10, a nie liczba cyfr po znaku "." – tamhoang

+0

W przypadku drugiej, należy wziąć pod uwagę, gdy całkowita długość> 10. Prawdopodobnie potrzebujesz metody rozszerzenia dla drugiej. –

+0

@GiladGreen, co z dziesiętnym a = 12345678910m? –

2

można użyć .ToString() aby wykonać to zadanie:

decimal aDecimalVal = 10.234m; 
string decimalString = aDecimalVal.ToString("#.000"); // "10.234" 
aDecimalVal.ToString("#.00"); // "10.23" 
aDecimalVal.ToString("#.0000"); // "10.2340" 

liczba 0 po . w ciągu formatu będzie grudniu ide liczba miejsc w ciągu dziesiętnym.

Aktualizacje: Więc chcesz znaleźć liczbę cyfr po przecinku punktów, a więc zmiany w kodzie będzie jak następuje:

decimal aDecimalVal = 10.2343455m; 
int count = BitConverter.GetBytes(decimal.GetBits(aDecimalVal)[3])[2]; 
string formatString = String.Format("N{0}",count.ToString()); 
string decimalString = aDecimalVal.ToString(formatString); // "10.2343455" 
+0

, ale nie znam dokładnej liczby cyfr po "." postać – tamhoang

1

udaje mi się zrobić to za pomocą podwójnie. Czy to jest to, czego potrzebujesz? Nie dostaję drugiej części twojego pytania.

double a = 12; 
    string b = a.ToString("0.0000000000######"); 
    Console.WriteLine(b); 
0

Na pierwszej, jeśli nie wiem, ile cyfry zmienna może być, można mieć metodę rozszerzenia:

public static string ToSpecificFormat(this decimal value) 
{ 
    var count = BitConverter.GetBytes(decimal.GetBits(value)[3])[2]; 
    return value.ToString(count == 0 ? "N1" : "N" + count); 
} 

Będzie to upewnij się, że jest co najmniej 1 cyfra na wyjściu.

W przypadku drugiej, wybrana odpowiedź nie powiedzie się, jeśli liczba> 1000000000.To jedno powinno działać:

public static string ToFixedLength(this decimal value) 
{ 
    if (value >= 1000000000m) return value.ToString("N0"); 

    var format = 9 - Math.Floor(value).ToString().Length; 
    return value.ToString("N" + format); 
} 

wyjściowa:

1.234m.ToFixedLength(); // 1.23400000 
101m.ToFixedLength(); // 101.000000 
123456789123m.ToFixedLength(); // 123,456,789,123 
0

jeśli chcesz wynik jako ciąg znaków, tylko analizować je i sformatować go do miejsc, jeden po przecinku:

string strTemp = 12; 
double temp = Double.Parse(strTemp, CultureInfo.InvariantCulture); 
string result = temp.ToString("N1", CultureInfo.InvariantCulture); 

Zaokrąglić do 2 miejsc po przecinku, np. 27.658 => 27,66

Upewnij się, że zawsze są 2 miejsca dziesiętne np. 12 => 12,00, 12,5 => 12,50

Dobre dopasowanie do kwot walutowych.

strTemp.ToString("F");