Mam wymóg formatowania dużych liczb, takich jak 4 316 000, jako "4,3 miliona".Formatowanie dużych liczb za pomocą .NET
Jak mogę to zrobić w języku C#?
Mam wymóg formatowania dużych liczb, takich jak 4 316 000, jako "4,3 miliona".Formatowanie dużych liczb za pomocą .NET
Jak mogę to zrobić w języku C#?
Możesz użyć Log10, aby ustalić prawidłowy podział. Coś takiego może działać:
double number = 4316000;
int mag = (int)(Math.Floor(Math.Log10(number))/3); // Truncates to 6, divides to 2
double divisor = Math.Pow(10, mag*3);
double shortNumber = number/divisor;
string suffix;
switch(mag)
{
case 0:
suffix = string.Empty;
break;
case 1:
suffix = "k";
break;
case 2:
suffix = "m";
break;
case 3:
suffix = "b";
break;
}
string result = shortNumber.ToString("N1") + suffix; // 4.3m
Głosowało na prawda. –
Uwielbiam podejście brzytwy Ockhama! – code4life
podziel liczbę przez 1000000,0, a następnie dodaj "m".
Pamiętaj o zaokrągleniu liczby do 1 miejsca po przecinku.
to działa, jeśli zawsze próbuje zrobić miliony, ale nie, jeśli chce tysiące, miliony, miliardy, itp. –
pytanie zadawane na temat liczby jak 4,316,000 jako "4,3 m", inne formaty nie były w wymaganiach :) –
long valueToFormat = 4316000;
var dict = new Dictionary<long, string>() {
{1000000000, "b"},
{1000000, "m"},
{1000, "k"}
};
string formattedValue = valueToFormat.ToString();
foreach (long n in dict.Keys.OrderBy(k => k)) {
if (valueToFormat < n) {
continue;
}
double value = Math.Round(valueToFormat/(double)n, 1);
formattedValue = String.Format("{0}{1}", value, dict[n]);
}
Console.WriteLine(formattedValue);
Jeśli tylko w systemie Windows można użyć oświadczenie p-powołać się w C# lub VB.NET zadzwonić Win32 funkcjonuje StrFormatByteSizeW lub StrFormatByteSize64. Jeśli twoja aplikacja/witryna ma być uruchomiona na co najmniej Vista SP1 lub Server 2008, jest jeszcze StrFormatByteSizeEx z kilkoma dodatkowymi opcjami.
Próbka z docs MSDN:
Numeric value Text string
532 532 bytes
1340 1.30KB
23506 22.9KB
2400016 2.29MB
2400000000 2.23GB
Te API obsługuje również lokalizację poprawnie dla nieanglojęzycznych użytkowników.
Nie byłoby to 4 316 000 jako "4,3 miliona", tak jak zadane pytanie, ale raczej "4.12MB" –
Ups, przeczytaj pytanie dotyczące dzielników binarnych zamiast dziesiętnych. – devstuff
public static class Program
{
private static void Main(string[] args)
{
double[] numbers =
{
3000, 3300, 3333, 30000, 300000, 3000000, 3000003, 0.253, 0.0253, 0.00253, -0.253003
};
foreach (var num in numbers)
{
Console.WriteLine($"{num} ==> {num.Humanize()}");
}
Console.ReadKey();
}
public static string Humanize(this double number)
{
string[] suffix = {"f", "a", "p", "n", "μ", "m", string.Empty, "k", "M", "G", "T", "P", "E"};
var absnum = Math.Abs(number);
int mag;
if (absnum < 1)
{
mag = (int) Math.Floor(Math.Floor(Math.Log10(absnum))/3);
}
else
{
mag = (int) (Math.Floor(Math.Log10(absnum))/3);
}
var shortNumber = number/Math.Pow(10, mag*3);
return $"{shortNumber:0.###}{suffix[mag + 6]}";
}
}
Powinno to wyjście:
3000 ==> 3k
3300 ==> 3,3k
3333 ==> 3,333k
30000 ==> 30k
300000 ==> 300k
3000000 ==> 3M
3000003 ==> 3M
0,253 ==> 253m
0,0253 ==> 25,3m
0,00253 ==> 2,53m
-0,253003 ==> -253,003m
Um, język programowania? Platforma? Pomóż nam tutaj. Krótka odpowiedź brzmi: napisz jakiś kod, aby sformatować różne zakresy wartości odpowiednio na podstawie wymagań. –
@ Jim: C# znajduje się w tagach pytania. Pytanie może pomóc, czyniąc to trochę bardziej oczywistym. –
Jim jest trollem! –