Java 7在数字文字中用下划线表示

当我们必须用一个_来分隔数字中的数字时,我不会理解下面这个我不能使用它的情况:

  • 在预期有一串数字的位置(如JDK7指南中所述)

一些例子?

你不必使用“_”,你可以 。 在提案中给出的例子是信用卡号码,电话号码或女巫的简单数字,在代码中有一个分隔符是有意义的。

对于“在一串数字是预期的位置”这只是在它应该开始(或结束)与数字的地方。 这里有些例子。

请注意,根据此build议,下划线只能放在数字之间。 它们不能被放置在通常预期的一串数字的位置上:

int x1 = _52; //这是一个标识符,而不是数字文字。

int x2 = 5_2; // 好。 (十进制文字)

int x2 = 52_; //非法 (下划线必须始终位于数字之间)

int x3 = 5_______2; // 好。 (十进制文字)

int x4 = 0_x52; //非法 不能在“0x”基数前缀中加下划线。

int x5 = 0x_52; //非法 (下划线必须始终位于数字之间)

int x6 = 0x5_2; // 好。 (hex文字)

int x6 = 0x52_; //非法 (下划线必须始终位于数字之间)

int x6 = 0x_; //非法 (不适用于删除下划线)

int x7 = 0_52; // 好。 (八进制文字)

int x7 = 05_2; // 好。 (八进制文字)

int x8 = 052_; //非法 (下划线必须始终位于数字之间)


资源:

  • OpenJDK – 项目硬币 – build议:数字下划线(版本2)
  • 乔达西的博客 – 项目硬币:项目硬币:文字语法黑客

正如Javadoc所写:

在Java SE 7和更高版本中,任何数字的下划线字符(_)都可以出现在数字字面上的数字之间的任何位置。 例如,此function使您能够分隔数字文本中的数字组,从而提高代码的可读性。

例如,如果您的代码包含具有许多数字的数字,则可以使用下划线字符以三个一组来分隔数字,这与使用逗号或空格等标点符号作为分隔符类似。

 long creditCardNumber = 1234_5678_9012_3456L; long socialSecurityNumber = 999_99_9999L; float pi = 3.14_15F; long hexBytes = 0xFF_EC_DE_5E; long hexWords = 0xCAFE_BABE; long maxLong = 0x7fff_ffff_ffff_ffffL; byte nybbles = 0b0010_0101; long bytes = 0b11010010_01101001_10010100_10010010; 

它看起来像有人杀死原来的post(OP)中的url。 这是整个讨厌的URL,以防某些格式化function再次杀死它:

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

您正在说的那个页面的具体引用如下:

您只能在数字之间放置下划线; 你不能在下面的地方放置下划线:

  • 在一个数字的开头或结尾

  • 在浮点数字中与小数点相邻

  • 在F或L后缀之前

  • 在期望一串数字的位置

顺便说一下,为了尽可能保持自信,应该提到的是,对于第三点,不能在D后缀之前使用下划线,如下例所示:

 double trouble = 123.456_D; //fail float myBoat = 321.123_F; //fail long winded = 90210_L; //fail 

我也觉得第三点很好奇。 我的意思是,大多数情况下,前三点都涵盖了这些情况,那么他们说的这个神秘的“数字串”是什么呢? 哪一种情况实际上没有得到前三点强迫他们join这个神秘的第四点?

最初我以为他们是在谈论hex符号或二进制表示法,其中一个数字是在b或x之后,如下面的示例不起作用:

 byte size = 0_b111101; //fail byte me = 0b_111101; //fail int hexed = 0_x_BABE; //fail 

不过,我认为这在技术上可能与第一点相同,即下划线不能在数字的开头; 但当然,在使用二进制或hex的“b”或“x”之后,预计会有一串“数字”,对吗? 所以如果我是一个投注人,我可能会在二进制/hex情况下投入一些资金。 但是我有另外一种可能的情况,我可以对冲我的赌注。 在这里。

就我个人而言,我希望在Java中有一条规则,说在谈论java.lang.String时只能使用“string”这个词。 允许使用“string”这个术语来保留它的行人意思会引起混淆,这就是一个很好的例子。

现在,如果第四点表示“在期望数字的java.lang.String位置”我可能会得出结论,他们正在谈论的实际java.lang.String对象,表示需要parsing的数字。 所以,拿这段代码:

 int i = Integer.parseInt("123_456"); 

会编译? 那会跑? 它会很好地编译,但是当然,parseInt方法需要一个java.lang.String数字,validation或parsing数字java.lang.String将在运行时触发以下错误:

线程“main”中的exceptionjava.lang.NumberFormatException:对于inputstring:“123_456”at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)at java.lang.Integer.parseInt(Integer.java:492)at java.lang.Integer.parseInt(Integer.java:527)在Tester.main(Tester.java:7)

当然,这是一个运行时错误,看起来Oracle文档实际上是在编译时标记错误。 但是,这当然是一个“数字串”预期的场景。

现在,如果只有Oracle文档是Wiki格式的话。 它可能会诱使我进入并添加如下内容:

您只能在数字之间放置下划线; 你不能在下面的地方放置下划线:

  • 在一个数字的开始或结尾

  • 在浮点数字中与小数点相邻

  • 在“F”或“L”或“D”后缀(我加了'D')之前

  • 在hex和二进制标记“x”和“b”之前或之后,

  • 如果你给一个除了数字之外什么也不指定的方法提供一个java.lang.String,那么期望在后台使用的分析algorithm抛出一个运行时exception。

顺便说一句,我只是在TheServerSide上写了一篇关于这个主题的文章。 随意去看看。 本文旨在打破Oracleauthentication专家,Java 7程序员authentication目标,但它是一个相当全面和易于阅读的文章,只是一般地解释使用下划线的规则。

OCPJPauthentication:你需要知道关于带下划线的数字文字

希望有所帮助。

不知道,但这里的语法,享受。 (我在任何地方都看不到“数字串”)

http://download.oracle.com/otndocs/jcp/enhancements-0.875-pr-oth-JSpec/

 IntegerLiteral: DecimalIntegerLiteral HexIntegerLiteral OctalIntegerLiteral BinaryIntegerLiteral BinaryIntegerLiteral: BinaryNumeral IntegerTypeSuffixopt BinaryNumeral: 0 b BinaryDigits 0 B BinaryDigits DecimalNumeral: 0 NonZeroDigit Digitsopt NonZeroDigit Underscores Digits Underscores: _ Underscores _ Digits: Digit Digit DigitsAndUnderscoresopt Digit DigitsAndUnderscores: DigitOrUnderscore DigitsAndUnderscores DigitOrUnderscore DigitOrUnderscore: Digit _ HexDigits: HexDigit HexDigit HexDigitsAndUnderscoresopt HexDigit HexDigitsAndUnderscores: HexDigitOrUnderscore HexDigitsAndUnderscores HexDigitOrUnderscore HexDigitOrUnderscore: HexDigit _ OctalNumeral: 0 OctalDigits 0 Underscores OctalDigits OctalDigits: OctalDigit OctalDigit OctalDigitsAndUnderscoresopt OctalDigit OctalDigitsAndUnderscores: OctalDigitOrUnderscore OctalDigitsAndUnderscores OctalDigitOrUnderscore OctalDigitOrUnderscore: OctalDigit _ BinaryDigits: BinaryDigit BinaryDigit BinaryDigitsAndUnderscoresopt BinaryDigit BinaryDigitsAndUnderscores: BinaryDigitOrUnderscore BinaryDigitsAndUnderscores BinaryDigitOrUnderscore BinaryDigitOrUnderscore: BinaryDigit _ BinaryDigit: one of 0 1 

我对此的解释是,下划线不能自己放置在通常会出现一串数字的位置:

 int x1= _; // Illegal. 

我相信“在一串数字是预期的位置”涵盖像string文字中的转义序列的东西。 例如,你不能说“\ u00_11”。

“在预期数字串的位置”是指期望包含数字的Stringtypes的variables,然后使用下划线将使数字的下划线部分成为下划线部分。 例如看下面的代码:

 int num = 999_333; String anum = "999_333"; System.out.println(num); //Outputs 999333 System.out.println(anum); //Outputs 999_333 

所以,如果你有一个方法需要一串数字作为参数之一,不要使用下划线来分隔数字,因为它将被视为任何其他string。

TL; TR;

不必在任何地方使用它 ,但是如果你愿意, 你可以在每个数字之间的任何地方使用它

对提高可读性尤其有用:

 10_000_000_000 // Is equal to 10000000000 7_687_316_418_138_483.345_938 // Is equal to 7687316418138483.345938