一种在C#中编写大数字文字的方法
我有这样的方法:
Prefix GetPrefix(decimal value) { if(value > 11000000000000000000) return Prefix.CosmicBig; if(value > 1000000000000000) return Prefix.ReallyBig; if(value > 3000000000000) return Prefix.Big; if(value > 50000000) return Prefix.Okay; if(value > 750000) return Prefix.MostlyNormal; if(value > 750000) return Prefix.SoSo; if(value > 750) return Prefix.Small; return Prefix.MiserablySmall; }
确切的值并不重要。 重要的是它们有时会被更改(前缀用于绘图,一些文本区域在开发中会改变大小)。 我正在寻找一种以一种方式来编写这些文字的方法,这种方式很容易被人类改变它,而不必计算所有的零。 分隔符会很好。 我想写11 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000
,但这只是更难以管理。 使用Math.Pow()
可以做得更好,但我Math.Pow()
使用这样的计算来定义常量。
您可以为int
引入扩展方法:
750.Thousand(); 5.Million(); 100.Billion();
这些方法的实现很简单:
public static int Thousand(this int value) { return value * 1000; } public static int Million(this int value) { return value.Thousand() * 1000; } // etc.
确保为更大数字的方法返回适当的数据类型:
public static long Billion(this int value) { return value.Million() * 1000; }
不幸的是,您必须为要支持的每个积分或浮点类型编写这些方法。
拥有一整套这样的扩展方法可以让你以相对自然的方式表达你的大数字,即使最后它不只是全部为零:
100.Billion() + 30.Thousand() + 300 // == 100,000,030,300
如果你想获得幻想,你甚至可以考虑嵌套它们:
100.Billion(30.Thousand(300))
但我认为这会失去一些表现力,因为人们会想知道参数意味着什么。
仍然,实现将如下所示:
public static long Billion(this int value, long add) { return value.Million() * 1000 + add; }
使用这些扩展方法有一个小缺点:您的数字不再是编译时常量。 它们是在运行时计算的。 在绝大多数情况下,这应该不是问题。
而不是11000000000000000000
你可以使用11e18
。 用m
表示它是小数,所以11e18m
。