2011-04-11 70 views

回答

4

我提供樣品碼。請儘量使它在你的方式

private static string ToEngineeringNotation(this double d) 
    { 
     double exponent = Math.Log10(Math.Abs(d)); 
     if (Math.Abs(d) >= 1) 
     { 
      switch ((int)Math.Floor(exponent)) 
      { 
       case 0: case 1: case 2: 
        return d.ToString(); 
       case 3: case 4: case 5: 
        return (d/1e3).ToString() + "k"; 
       case 6: case 7: case 8: 
        return (d/1e6).ToString() + "M"; 
       case 9: case 10: case 11: 
        return (d/1e9).ToString() + "G"; 
       case 12: case 13: case 14: 
        return (d/1e12).ToString() + "T"; 
       case 15: case 16: case 17: 
        return (d/1e15).ToString() + "P"; 
       case 18: case 19: case 20: 
        return (d/1e18).ToString() + "E"; 
       case 21: case 22: case 23: 
        return (d/1e21).ToString() + "Z"; 
       default: 
        return (d/1e24).ToString() + "Y"; 
      } 
     } 
     else if (Math.Abs(d) > 0) 
     { 
      switch ((int)Math.Floor(exponent)) 
      { 
       case -1: case -2: case -3: 
        return (d * 1e3).ToString() + "m"; 
       case -4: case -5: case -6: 
        return (d * 1e6).ToString() + "μ"; 
       case -7: case -8: case -9: 
        return (d * 1e9).ToString() + "n"; 
       case -10: case -11: case -12: 
        return (d * 1e12).ToString() + "p"; 
       case -13: case -14: case -15: 
        return (d * 1e15).ToString() + "f"; 
       case -16: case -17: case -18: 
        return (d * 1e15).ToString() + "a"; 
       case -19: case -20: case -21: 
        return (d * 1e15).ToString() + "z"; 
       default: 
        return (d * 1e15).ToString() + "y"; 
      } 
     } 
     else 
     { 
      return "0"; 
     } 
    } 
5

不,我不相信有一個格式字符串,會爲你做的。

您可能會發現第三方庫來做到這一點,並且我知道有內置的Win32例程來將文件大小轉換爲類似的表示形式,但是可以使用1024而不是1000作爲「基地「的K/M /等。 This Stack Overflow answer顯示了一些C#代碼,但我確定平臺中也有一些東西......正如我所說的那樣,這是針對文件大小的,這可能是也可能不是你想要的。

+0

想知道怎麼做,這樣,喬恩斯基特289K – V4Vendetta 2011-04-11 06:20:17

+0

@ V4Vendetta:我會想象他們寫了類似於我掛了答案代碼中的一些代碼。 – 2011-04-11 07:27:05

+0

@ V4Vendetta,你錯了。它的671k現在大聲笑 – 2014-05-04 09:38:48

5

我爲你寫了這個。

string onem = intToSimple(1000000); 
string onek = intToSimple(1000); 
private string intToSimple(int number) 
{ 
    if(val > 1000000000000) 
     return (val/1000000000000).ToString("0.00") + "tr"; 
    else if(val > 1000000000) 
     return (val/1000000000).ToString("0.00") + "b"; 
    else if(val > 1000000) 
     return (val/1000000).ToString("0.00") + "m"; 
    else if(val > 1000) 
     return (val/1000).ToString("0.00") + "k"; 
    else 
     return value.ToString("0.00"); 
} 
+0

我忘了複製每個分割,但現在修復它。 – 2011-04-11 06:19:26

+0

您還需要提及一個小於1的數字。請參閱下面的答案 – Marshal 2011-04-11 06:21:02

+0

感謝 - 「val」,「value」和「number」的混合和匹配,但這樣做的竅門。 – 2013-02-20 19:18:01

0

你將不能夠做到這一點使用的String.Format,但你可以試試這個:

int i = 2400; 
string j = i/1000.0 + "k"; 
Console.WriteLine(j); 
+0

這隻能處理一個案例。他顯然想要處理幾乎所有可能的案例。 – 2011-04-11 13:31:40

1

您也可以嘗試以下方法:

轉換你的電話號碼轉換爲字符串科學格式:2400 - > 2.4e + 003; 2,6000,000→2.6e + 006

然後用所需的SI前綴代替指數(例如e + 003→k,e + 006→M,e-009→n)

我創建了以下擴展用於此目的:

using System; 
using System.Globalization; 

/// <summary> 
/// Si prefixed string conversion class 
/// </summary> 
public static class SIPrefixedString 
{ 
    /// <summary> 
    /// converts the value into a string with SI prefix 
    /// </summary> 
    /// <param name="value">The value.</param> 
    /// <returns>si prefixed string</returns> 
    public static string ToSIPrefixedString(this double value) 
    { 
     string stringValue = value.ToString("#E+00", CultureInfo.InvariantCulture); 
     string[] stringValueParts = stringValue.Split("E".ToCharArray()); 
     int mantissa = Convert.ToInt32(stringValueParts[0], CultureInfo.InvariantCulture); 
     int exponent = Convert.ToInt32(stringValueParts[1], CultureInfo.InvariantCulture); 
     while (exponent % 3 != 0) 
     { 
      mantissa *= 10; 
      exponent -= 1; 
     } 

     string prefixedValue = mantissa.ToString(CultureInfo.InvariantCulture); 
     switch (exponent) 
     { 
      case 24: 
       prefixedValue += "Y"; 
       break; 
      case 21: 
       prefixedValue += "Z"; 
       break; 
      case 18: 
       prefixedValue += "E"; 
       break; 
      case 15: 
       prefixedValue += "P"; 
       break; 
      case 12: 
       prefixedValue += "T"; 
       break; 
      case 9: 
       prefixedValue += "G"; 
       break; 
      case 6: 
       prefixedValue += "M"; 
       break; 
      case 3: 
       prefixedValue += "k"; 
       break; 
      case 0: 
       break; 
      case -3: 
       prefixedValue += "m"; 
       break; 
      case -6: 
       prefixedValue += "u"; 
       break; 
      case -9: 
       prefixedValue += "n"; 
       break; 
      case -12: 
       prefixedValue += "p"; 
       break; 
      case -15: 
       prefixedValue += "f"; 
       break; 
      case -18: 
       prefixedValue += "a"; 
       break; 
      case -21: 
       prefixedValue += "z"; 
       break; 
      case -24: 
       prefixedValue += "y"; 
       break; 
      default: 
       prefixedValue = "invalid"; 
       break; 
     } 

     return prefixedValue; 
    } 

    /// <summary> 
    /// returns the double value for the si prefixed string 
    /// </summary> 
    /// <param name="prefixedValue">The prefixed value.</param> 
    /// <returns>double value</returns> 
    public static double FromSIPrefixedString(this string prefixedValue) 
    { 
     string scientificNotationValue = prefixedValue; 

     if (scientificNotationValue.Contains("E+") == false && scientificNotationValue.Contains("E-") == false) 
     { 
      scientificNotationValue = scientificNotationValue 
       .Replace("Y", "E+24") 
       .Replace("Z", "E+21") 
       .Replace("E", "E+18") 
       .Replace("P", "E+15") 
       .Replace("T", "E+12") 
       .Replace("G", "E+09") 
       .Replace("M", "E+06") 
       .Replace("k", "E+03") 
       .Replace("m", "E-03") 
       .Replace("u", "E-06") 
       .Replace("n", "E-09") 
       .Replace("p", "E-12") 
       .Replace("f", "E-15") 
       .Replace("a", "E-18") 
       .Replace("z", "E-21") 
       .Replace("y", "E-24"); 
     } 

     return Convert.ToDouble(scientificNotationValue, CultureInfo.InvariantCulture); 
    } 
0

我覺得你的問題是一般的,反正我後你對某些情況下一個簡單的答案:

private string Cnv(int num) 
{ 
    double DIV=1000f; 

    double f = num; 
    if (f<DIV) return num.ToString(); 
    f = num/DIV; 
    if (f < DIV) return f.ToString("0.0k"); 
    f = num/DIV; 
    if (f < DIV) return f.ToString("0.0m"); 
    return (f/DIV).ToString("0.0g"); 
} 
0

這是正確的一個在擴展形式。

public static string ToSimpleK(this int val) 
    { 
     if (val > 1000000000) 
      return ((decimal)val/1000000000).ToString("0.00") + "b"; 
     else if (val > 1000000) 
      return ((decimal)val/1000000).ToString("0.00") + "m"; 
     else if (val > 1000) 
      return ((decimal)val/1000).ToString("0.00") + "k"; 
     else 
      return val.ToString(); 
    }