答案 0 :(得分:58)
您 使用“_”,可以。提案中给出的示例包括信用卡号,电话号码或简单的数字,以便在代码中使用分隔符。
对于“在预期有一串数字的位置”,它只是在应该以数字开始(或结束)的位置。以下是一些例子。
请注意,根据此提案,下划线只能放在数字之间。它们不能单独放置在通常需要一串数字的位置:
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; // 好。 (十六进制文字)
int x6 = 0x52_; //非法。 (下划线必须始终在数字之间)
int x6 = 0x_; //非法。 (删除下划线无效)
int x7 = 0_52; // 好。 (八进制文字)
int x7 = 05_2; // 好。 (八进制文字)
int x8 = 052_; //非法。 (下划线必须始终在数字之间)
<强>资源:强>
答案 1 :(得分:26)
正如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;
答案 2 :(得分:5)
看起来有人在原始帖子(OP)中杀死了该网址。这里是一个讨厌的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
我也发现第三点很奇怪。我的意思是,在大多数情况下,所有场景都包含在前三个点中,那么这个神秘的数字串是什么?&#39;为什么他们说话?前三个点实际上没有解决哪个场景迫使他们添加这个神秘的第四个?
最初我以为他们是在谈论十六进制表示法或二进制表示法,其中b或x后面会有一个数字,如下面的例子那样:
byte size = 0_b111101; //fail
byte me = 0b_111101; //fail
int hexed = 0_x_BABE; //fail
尽管如此,我认为技术上可能与第一点相同,后者表示下划线不能在数字的开头;但肯定是一串数字&#39;预计在&#39; b&#39;或者&#39; x&#39;当使用二进制或十六进制时,对吧?所以,如果我是一个博彩人,我可能会在二进制/十六进制场景背后投入一些资金。但我有另一个可能的情况,我可以对冲我的赌注。在这里。
就个人而言,我希望Java中有一条规则说你只能使用“&#39; string&#39;在谈论java.lang.String时。允许使用术语&#39;字符串&#39;保留它的行人意义会引起混乱,这是一个很好的例子。
现在,如果第四点说&#34;在期望java.lang.String数字的位置&#34;我可能会得出结论,他们正在谈论实际的java.lang.String对象,它们代表需要解析的数字。所以,拿这段代码:
int i = Integer.parseInt("123_456");
会编译吗?那会跑吗?它编译正常,但是当然,parseInt方法需要一个java.lang.String数字,并且验证或解析该数字java.lang.String将在运行时触发以下错误:
线程中的异常&#34; main&#34; java.lang.NumberFormatException:用于输入 string:&#34; 123_456&#34;在 java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 在java.lang.Integer.parseInt(Integer.java:492)at java.lang.Integer.parseInt(Integer.java:527) 在Tester.main(Tester.java:7)
当然,这是一个运行时错误,看起来Oracle文档确实在谈论将在编译时标记的错误。但这肯定是一个数字串&#39;是期待。
现在,如果只有Oracle文档是Wiki格式的话。它可能会诱使我进入并添加如下内容:
您只能在数字之间放置下划线;你不能在下列地方放置下划线:
在数字的开头或结尾
与浮点字面值中的小数点相邻
在&#39; F&#39;之前或者&#39; L&#39;或者&#39; D&#39;后缀(我添加了&#39; D&#39;)
十六进制和二进制标记之前或之后&#39; x&#39;和&#39; b&#39;
如果你向一个只需要数字的方法提供一个java.lang.String,那么期望在幕后使用的解析算法会抛出一个运行时异常。
顺便说一下,我刚刚在TheServerSide上写了一篇关于这个主题的文章。随意看看。本文旨在获得Oracle认证专家,Java 7程序员认证目标,但它是一篇非常全面且易于阅读的文章,通常只是解释使用下划线的规则。
OCPJP Certification: What you need to know about numeric literals with underscores
希望有所帮助。
答案 3 :(得分: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
答案 4 :(得分:2)
我对此的解释是,在通常预期会有一串数字的位置,下划线不能单独放置 :
int x1= _; // Illegal.
答案 5 :(得分:2)
我相信 在预期数字字符串的位置 涵盖字符串文字中的转义序列等内容。例如,您不能说\u00_11
。
答案 6 :(得分:2)
“在预期数字字符串的位置”表示期望包含数字的String类型的变量,然后使用下划线将使下划线成为数字的一部分。例如,请查看以下代码:
int num = 999_333;
String anum = "999_333";
System.out.println(num); //Outputs 999333
System.out.println(anum); //Outputs 999_333
因此,如果你有一个方法期望一个数字字符串作为参数之一,请不要使用下划线来分隔数字,因为它将被视为任何其他字符串。
答案 7 :(得分:2)
您不必在任何地方使用,但如果您愿意,可以在每个数字之间的任何地方使用。
这对提高可读性非常有用 :
10_000_000_000 // Is equal to 10000000000
7_687_316_418_138_483.345_938 // Is equal to 7687316418138483.345938