rfc:number_format_separator
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
rfc:number_format_separator [2015/12/23 21:41] – tpunt | rfc:number_format_separator [2016/01/13 18:47] – tpunt | ||
---|---|---|---|
Line 3: | Line 3: | ||
* Date: 2015-12-19 | * Date: 2015-12-19 | ||
* Author: Thomas Punt, tpunt@php.net | * Author: Thomas Punt, tpunt@php.net | ||
- | * Status: | + | * Status: |
* First Published at: http:// | * First Published at: http:// | ||
Line 10: | Line 10: | ||
Long numerical literals can be a source of poor readability in code. Take the following examples: | Long numerical literals can be a source of poor readability in code. Take the following examples: | ||
<code php> | <code php> | ||
- | 197823459; | + | // what number is this? |
- | 97802345932 > 97802349532; // which number is greater? | + | 197823459; |
- | 9803458239 === 9803457239; // are these numbers equal? | + | |
+ | // which number is greater? | ||
+ | 97802345932 > 97802349532; | ||
+ | |||
+ | // are these numbers equal? | ||
+ | 9803458239 === 9803457239; | ||
</ | </ | ||
- | These are difficult to read and difficult reason about. To ameliorate this issue, this RFC proposes the introduction of a digit separator in numerical literals. This will enable | + | These are difficult to read and difficult reason about. To ameliorate this issue, this RFC proposes the introduction of a digit separator in numerical literals. This will enable the examples |
<code php> | <code php> | ||
- | 197_823_459; | + | // what number is this? |
- | 97_802_345_932 > 97_802_349_532; // which number is greater? | + | 197_823_459; |
- | 9_803_458_239 === 9_803_457_239; // are these numbers equal? | + | |
+ | // which number is greater? | ||
+ | 97_802_345_932 > 97_802_349_532; | ||
+ | |||
+ | // are these numbers equal? | ||
+ | 9_803_458_239 === 9_803_457_239; | ||
</ | </ | ||
Line 33: | Line 43: | ||
0b0010_1101; | 0b0010_1101; | ||
0267_3432; // versus 02673432 | 0267_3432; // versus 02673432 | ||
+ | 1_123.456_7e2 // versus 1123.4567e2 | ||
</ | </ | ||
- | ==== Chosen | + | The underscores will be stripped out during the lexing stage, and so the runtime will not be affected in any way. For example: |
+ | <code php> | ||
+ | var_dump(1_000_000); | ||
+ | </ | ||
+ | |||
+ | ==== Chosen | ||
+ | |||
+ | The digit separator is used to mark boundaries between digits - it is not used to separate digits from other characters. The following syntax choices are therefore based on this. | ||
- | === Disallow | + | === Disallow |
Leading underscores will not enhance readability and will conflict with constant naming conventions. | Leading underscores will not enhance readability and will conflict with constant naming conventions. | ||
Line 44: | Line 62: | ||
</ | </ | ||
- | === Disallow | + | === Disallow |
Trailing underscores will not enhance readability - if anything, they will decrease it. | Trailing underscores will not enhance readability - if anything, they will decrease it. | ||
Line 51: | Line 69: | ||
</ | </ | ||
- | === Disallow | + | === Disallow |
Allowing for two or more underscores to be placed together will provide no further readability benefits. | Allowing for two or more underscores to be placed together will provide no further readability benefits. | ||
Line 58: | Line 76: | ||
</ | </ | ||
- | === Enable | + | === Enable |
Underscores are not allowed around the period for floats, around the **0x** for hexadecimal notation, around the **0b** for binary notation, or around the **e** for scientific notation. This is because readability will be negatively impacted, and it doesn' | Underscores are not allowed around the period for floats, around the **0x** for hexadecimal notation, around the **0b** for binary notation, or around the **e** for scientific notation. This is because readability will be negatively impacted, and it doesn' | ||
Line 70: | Line 88: | ||
</ | </ | ||
- | === Enable for Arbitrary Grouping | + | === Enable for arbitrary grouping |
Underscores may be freely interspersed between arbitrary groups of digits, enabling for developers to group the digits as they see fit. One such argument for relaxing the interspersing of underscores is that not all countries group digits in sets of three [1]. | Underscores may be freely interspersed between arbitrary groups of digits, enabling for developers to group the digits as they see fit. One such argument for relaxing the interspersing of underscores is that not all countries group digits in sets of three [1]. | ||
Line 79: | Line 97: | ||
0x11_22_33_44_55_66; | 0x11_22_33_44_55_66; | ||
- | |||
0x1122_3344_5566; | 0x1122_3344_5566; | ||
</ | </ | ||
- | ==== Why the Underscore Character? ==== | + | ==== Why the underscore character? ==== |
The underscore: | The underscore: | ||
Line 103: | Line 120: | ||
Few other languages have deviated from using the underscore to separate digits. One notable exception is C++, where it could not use an underscore because of conflicts with user-defined literals (specifically in a hexadecimal context). Because PHP does not have such user-defined literals, there are no technical problems with using the underscore as a digit separator. This proposal therefore seeks to follow suite with the other languages. | Few other languages have deviated from using the underscore to separate digits. One notable exception is C++, where it could not use an underscore because of conflicts with user-defined literals (specifically in a hexadecimal context). Because PHP does not have such user-defined literals, there are no technical problems with using the underscore as a digit separator. This proposal therefore seeks to follow suite with the other languages. | ||
- | ==== Why no Support | + | ==== Why no support |
- | This RFC does not include stringy numerics because of the BC breakage involved. It would cause the coercion rules for strings to integers | + | This RFC does not include stringy numerics because of the BC breakage involved. It would mean changing |
+ | |||
+ | If formatting stringy | ||
===== Backward Incompatible Changes ===== | ===== Backward Incompatible Changes ===== | ||
Line 134: | Line 153: | ||
Support for stringy numerics could be added in the next major version. | Support for stringy numerics could be added in the next major version. | ||
- | ===== Proposed Voting Choices | + | ===== Vote ===== |
- | A simple yes/no voting option | + | A simple yes/no voting option |
+ | |||
+ | <doodle title=" | ||
+ | * Yes | ||
+ | * No | ||
+ | </ | ||
+ | |||
+ | Voting starts on January 13th and ends on January 20th. | ||
===== Patches and Tests ===== | ===== Patches and Tests ===== | ||
- | A patch has been made - this part will be updated soon. | + | PR: https:// |
===== Implementation ===== | ===== Implementation ===== | ||
Line 147: | Line 173: | ||
===== References ===== | ===== References ===== | ||
- | Current discussion: | + | Current discussion: |
Previous discussion on separators for numerical literals: https:// | Previous discussion on separators for numerical literals: https:// |
rfc/number_format_separator.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1