rfc:number_format_separator

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
rfc:number_format_separator [2015/12/23 00:09] – Slight restructure (partial rewrite #2) tpuntrfc:number_format_separator [2017/09/22 13:28] (current) – external edit 127.0.0.1
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: Draft+  * Status: Declined
   * First Published at: http://wiki.php.net/rfc/number_format_separator   * First Published at: http://wiki.php.net/rfc/number_format_separator
  
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? +// 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;
 </code> </code>
  
-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 for the above examples to be rewritten as:+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 above to be rewritten as:
 <code php> <code php>
-197_823_459; // what number is this? +// 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;
 </code> </code>
  
Line 33: Line 43:
 0b0010_1101; // versus 0b00101101 0b0010_1101; // versus 0b00101101
 0267_3432; // versus 02673432 0267_3432; // versus 02673432
 +1_123.456_7e2 // versus 1123.4567e2
 </code> </code>
  
-==== Chosen Semantics ====+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); // int(1000000) 
 +</code> 
 + 
 +==== Chosen syntax ==== 
 + 
 +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 Leading Underscores ===+=== Disallow leading underscores ===
  
 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:
 </code> </code>
  
-=== Disallow Trailing Underscores ===+=== Disallow trailing underscores ===
  
-Trailing underscores will not enhance readability (if anything, they will decrease).+Trailing underscores will not enhance readability if anything, they will decrease it.
 <code php> <code php>
-100_; // PHP Parse error:  syntax error, unexpected '_' (T_STRING) in ...+100_<=>1_000_+_CONST_NAME; // Parse error: syntax error, unexpected '_' (T_STRING)...
 </code> </code>
  
-=== Disallow Adjacent Underscores ===+=== Disallow adjacent underscores ===
  
 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.
 <code php> <code php>
-1__000; // PHP Parse error:  syntax error, unexpected '__000' (T_STRING) in+1__000___000_000; // Parse error: syntax error, unexpected '__000___000_000' (T_STRING)...
 </code> </code>
  
-=== Enable Underscores Between Digits Only ===+=== Enable underscores between digits only ===
  
-Underscores are not allowed around the period for floats, around the **0x** for hexadecimal numbersor around the **0b** for binary numbers. Other than thatthey may be freely interspersed between arbitrary groups of digits. This enables for the developer to group the digits as they see fit.+Underscores are not allowed around the period for floats, around the **0x** for hexadecimal notation, around the **0b** for binary notationor around the **e** for scientific notation. This is because readability will be negatively impacted, and it doesn't really serve the purpose of a "digit separator."
 <code php> <code php>
-100_.0; // PHP Parse error:  syntax error, unexpected '_' (T_STRING) in... +100_.0; // Parse error:  syntax error, unexpected '_' (T_STRING) in... 
-100._01; // PHP Parse error:  syntax error, unexpected '_01' (T_STRING) in... +100._01; // Parse error:  syntax error, unexpected '_01' (T_STRING) in... 
-0x_0123; // PHP Parse error:  syntax error, unexpected 'x_0123' (T_STRING) in... +0x_0123; // Parse error:  syntax error, unexpected 'x_0123' (T_STRING) in... 
-0b_0101; // PHP Parse error:  syntax error, unexpected 'b_0101' (T_STRING) in...+0b_0101; // Parse error:  syntax error, unexpected 'b_0101' (T_STRING) in... 
 +1_e2; // Parse error: syntax error, unexpected '_e2' (T_STRING)... 
 +1e_2; // Parse error: syntax error, unexpected 'e_2' (T_STRING)... 
 +</code>
  
-100_000; // interpreted as 100000 +=== Enable for arbitrary grouping of digits === 
-10_0.0_112; // interpreted as 100.0112 + 
-0b01_10_11_00; // interpreted as 0b01101100+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]. 
 +<code php> 
 +1_234_567; // grouped in sets of 3 
 +123_4567; // grouped in sets of 4 (Japan, China) 
 +1_00_00_00_000; // grouped according to India's numbering system 
 + 
 +0x11_22_33_44_55_66; // a number to be used as bytes, grouped by bytes 
 +0x1122_3344_5566; // a number to be used as 16-bit data, grouped by word
 </code> </code>
  
  
-==== Why the Underscore Character? ==== +==== Why the underscore character? ==== 
-The underscore has been chosen because of its wide usage in other languages for formatting numerical literals.+ 
 +The underscore
 +  * Is easy to type on the majority of keyboard layouts 
 +  * Does not conflict with PHP's grammar 
 +  * Acts as a clear and unambiguous delineator between digits (unlike the comma or period)
  
-The following languages all use an underscore:+It has also been widely adopted as a digit separator in a number of other languages, including:
   * Ada   * Ada
   * D   * D
Line 86: Line 118:
   * Elixir   * Elixir
  
-Few other languages have deviated from using the underscore to separate digits. One notable language that has deviated 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 in PHP. 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 for Stringy Numerics? ==== +==== Why no support for stringy numerics? ==== 
-This RFC does not include stringy numerics because of the BC breakage involved. It will cause the coercion rules for strings to integers to change, which may potentially have wide-ranging impacts for PHP programs. If formatting stringy integer literals is desired, then support for these can be done in the next major version of PHP.+This RFC does not include stringy numerics because of the BC breakage involved. It would mean changing the coercion rules for strings to integers, which may potentially have wide-ranging impacts for PHP programs. Also, support for stringy numerics can be quite easily emulated in userland code. 
 + 
 +If formatting stringy numerical literals is desired, then support for these can be added in the next major version of PHP.
  
 ===== Backward Incompatible Changes ===== ===== Backward Incompatible Changes =====
Line 119: 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 with a 2/3 majority required.+A simple yes/no voting option on whether to support digit separator in PHP. A 2/3 majority is required
 + 
 +<doodle title="Include a Digit Separator into PHP" auth="tpunt" voteType="single" closed="true"> 
 +   * Yes 
 +   * No 
 +</doodle> 
 + 
 +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://github.com/php/php-src/pull/1699
  
 ===== Implementation ===== ===== Implementation =====
Line 132: Line 173:
  
 ===== References ===== ===== References =====
 +Current discussion: https://marc.info/?l=php-internals&m=145149644624888&w=2
 +
 Previous discussion on separators for numerical literals: https://marc.info/?l=php-internals&m=142431171323037&w=2 Previous discussion on separators for numerical literals: https://marc.info/?l=php-internals&m=142431171323037&w=2
-Current discussionto be updated...+ 
 +[1]http://www.statisticalconsultants.co.nz/blog/how-the-world-separates-its-digits.html
  
 ===== Rejected Features ===== ===== Rejected Features =====
 Keep this updated with features that were discussed on the mail lists. Keep this updated with features that were discussed on the mail lists.
rfc/number_format_separator.1450829356.txt.gz · Last modified: 2017/09/22 13:28 (external edit)