58

当我们必须使用 a_来分隔数字中的数字时,我不明白以下我不能使用它的情况:

在需要一串数字的位置

(如 JDK7 指南中所述

一些例子?

4

8 回答 8

66

您不必使用“_”,您可以使用. 提案中给出的示例是信用卡号码、电话号码或简单的数字,在代码中使用分隔符是有意义的。

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

请注意,根据这个提议,下划线只能放在数字之间。它们不能单独放置在通常需要一串数字的位置:

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

诠释 x2 = 5_2; // 好的。(十进制文字)

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

整数 x3 = 5_______2; // 好的。(十进制文字。)

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

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

诠释 x6 = 0x5_2; // 好的。(十六进制文字)

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

诠释 x6 = 0x_; // 非法的。(删除下划线后无效)

诠释 x7 = 0_52; // 好的。(八进制文字)

诠释 x7 = 05_2; // 好的。(八进制文字)

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


资源:

于 2011-06-02T09:23:23.870 回答
29

正如Javadoc中所写:

在 Java SE 7 及更高版本中,任意数量的下划线字符 (_) 可以出现在数字文字中数字之间的任何位置。例如,此功能使您能够分隔数字文字中的数字组,这可以提高代码的可读性。

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

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;
于 2013-07-31T06:35:21.507 回答
6

看起来有人杀死了原始帖子 (OP) 中的 URL。这是整个讨厌的 URL,以防某些格式化功能再次杀死它:

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

我也觉得第三点很好奇。我的意思是,在大多数情况下,前三点涵盖了所有场景,那么他们所说的这个神秘的“数字串”是什么?前三点实际上没有解决哪种情况,迫使他们添加这个神秘的第四点?

最初我以为他们在谈论十六进制表示法或二进制表示法,其中 b 或 x 之后应有一个数字,如下所示不起作用:

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

不过,我认为这在技术上可能与第一点相同,即下划线不能位于数字的开头;但可以肯定的是,在使用二进制或十六进制时,在“b”或“x”之后应该出现“数字串”,对吧?所以如果我是一个赌徒,我可能会在二进制/十六进制场景后面投入一些钱。但我有另一个可能的情况,我可以对冲我的赌注。就这样吧。

就我个人而言,我希望 Java 中有一条规则说在谈论 java.lang.String 时只能使用“字符串”这个词。允许术语“字符串”保留其行人的含义会导致混淆,这是一个很好的例子。

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

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

那会编译吗?那会跑吗?它将编译得很好,但当然,parseInt 方法需要一个 java.lang.String 数字,并且验证或解析该数字 java.lang.String 将在运行时触发以下错误:

线程“主”java.lang.NumberFormatException 中的异常:对于输入字符串:“123_456”在 java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 在 java.lang.Integer.parseInt(Integer.java:492) 在java.lang.Integer.parseInt(Integer.java:527) 在 Tester.main(Tester.java:7)

当然,这是一个运行时错误,而且 Oracle 文档似乎真的在谈论将在编译时标记的错误。但这肯定是一个需要“数字串”的场景。

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

您只能在数字之间放置下划线;您不能在以下位置放置下划线:

  • 在数字的开头或结尾

  • 与浮点文字中的小数点相邻

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

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

  • 而且,如果您向只需要数字的方法提供 java.lang.String,则预计在幕后使用的解析算法会引发运行时异常。

顺便说一句,我刚刚在 TheServerSide 上写了一篇关于这个主题的小文章。随意看看。这篇文章旨在达到 Oracle Certified Professional, Java 7 Programmer 认证目标,但它是一篇非常全面且易于阅读的文章,只是大致解释了使用下划线的规则。

OCPJP 认证:关于带下划线的数字文字您需要了解的内容

希望有帮助。

于 2011-12-30T23:28:54.177 回答
4

TL;TR;

您不必在任何地方使用它,但如果需要,您可以在数字文字中的每个数字之间的任何地方使用它。

对于提高可读性特别有用

10_000_000_000 // Is equal to 10000000000
7_687_316_418_138_483.345_938 // Is equal to 7687316418138483.345938
于 2017-10-23T17:29:32.257 回答
3

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

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
于 2011-06-02T12:31:06.377 回答
2

“在需要一串数字的位置”意味着需要包含数字的 String 类型的变量,然后使用下划线将使下划线成为数字的一部分。例如看下面的代码:

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

因此,如果您有一个方法需要一个数字字符串作为参数之一,请不要使用下划线分隔数字,因为它将被视为任何其他字符串。

于 2013-10-10T14:37:38.260 回答
1

My interpretation of this is that underscores cannot be placed by themselves in positions where a string of digits would normally be expected:

int x1= _; // Illegal.
于 2011-06-02T09:33:53.640 回答
1

我相信预期一串数字的 In 位置涵盖了字符串文字中的转义序列等内容。例如,你不能说\u00_11.

于 2012-06-26T19:24:54.537 回答