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

时间:2011-06-02 09:14:46

标签: java java-7

当我们必须使用_来分隔数字中的数字时我不明白 以下我无法使用的情况:

  

在一串数字的位置      预计

(如JDK7指南here中所述)

一些例子?

8 个答案:

答案 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)

TL; TR;

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

这对提高可读性非常有用

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