Difference between revisions of "Template:Val/delimitnum"

From blackwiki
Jump to navigation Jump to search
blackwiki>Jimp
(bypass template {{str right}} to go directly to module & add comments)
m (42 revisions imported)
 
(11 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<includeonly><!--  
+
<includeonly><!--
                Test loss of precision by appending a fixed digit "1"
+
-->{{#ifeq: <!-- compare "04" to 4, and if so, output 4-digits pure
-->{{#ifexpr:({{{1|0}}}1)=({{{1|0}}})<!--
+
  What might be "04" is composed of three outputs: dot, len, and fmt -->
 +
  {{#invoke:String|find|{{{1}}}|.}}<!-- Output the zero if no dot.
 +
  -->{{#invoke:String|len <!-- Length of 4 with sign and spaces filtered? -->
 +
    |{{#invoke:String|replace|{{{1}}}|[-+ ]|plain=false}}}}<!--
 +
    That replace just filtered out any and all spaces, + or - characters.
 +
    But it's gotta have the minus sign first in the [-charclass].
 +
    Any fmt given?  If so comparison to "4" will fail -->{{{fmt|}}}
 +
| 4 |{{#invoke:String|replace|{{{1}}}|-|&minus;}}<!--  
 +
If fmt is nil, found . is 0, and filtered len is 4, then 04=4,
 +
and we have just output the number, replacing any - with a minus sign
  
  -->|<!--       Precision is lost. Display an error message.
+
Else:
  -->{{FormattingError|Too Many Digits|nocategory={{{nocategory|}}}}}<!--
+
-->|{{#switch: <!-- its not a pure 4-digit number with no fmt options given-->
 +
{{#invoke:String|sub|{{{1|0}}}|1|1}}
 +
  <!-- If the first char is ... -->
  
   -->|<!--       Precision is not lost. Display the number.
+
   |- <!-- ... one kind of dash, or another -->
+
  |− = {{#ifeq:{{{nosign|off}}}|off|−}}<!-- output a &minus; sign unless nosign
                Output the mathematical minus sign (not the minus-hyphen) if negative
+
    -->{{#ifeq:
  -->{{#ifexpr:{{{1|0}}}<0|&minus;}}<!--
+
          {{#invoke:String|sub|{{{1|0}}}|2|2}}|.|0}}<!--And then
 +
          then if next char is . then output a zero, else do || nothing.
 +
    -->{{#switch: {{{fmt}}} <!-- Format the rest of the number. -->
 +
      |commas={{formatnum:{{#invoke:String|sub|{{{1|0}}}|2}}}}
 +
      |#default = {{#invoke:Gapnum|main|{{#invoke:String|sub|{{{1|0}}}|2}}}}
 +
  }}
  
                Format according to the parameter fmt.
+
  <!-- follow same logic for leading + char -->
  -->{{#ifeq:{{{fmt|gaps}}}|gaps<!--
+
  |+={{#ifeq:{{{nosign|off}}}|off|+}}<!--
 +
    -->{{#ifeq:{{#invoke:String|sub|{{{1|0}}}|2|2}}|.|0}}<!--
 +
      -->{{#switch:{{{fmt}}}
 +
        |commas = {{formatnum:{{#invoke:String|sub|{{{1|0}}}|2}}}}
 +
        |#default = {{#invoke:Gapnum|main|{{#invoke:String|sub|{{{1|0}}}|2}}}}
 +
    }} <!-- follow similar logic for leading . char -->
 +
  |.=0<!--
 +
    -->{{#switch:{{{fmt}}}
 +
      |commas={{{1|0}}}
 +
      |#default = {{#invoke:Gapnum|main|{{{1|0}}}}}
 +
    }}
  
                Test whether the number is an integer.
+
  <!-- Else if first char is not . or - or + -->
    -->|{{#ifexpr:trunc({{{1|0}}}9)={{{1|0}}}9
+
  |#default = {{#switch:{{{fmt}}}  
          |<!--  
+
    |commas={{formatnum:{{{1|0}}}}}
                The number is an integer.
+
     |#default = {{#invoke:Gapnum|main|{{{1|0}}}}}
                Format it using (a) thin space(s) for grouping digits.
+
       }}
                Do not add a decimal point.  
+
  }}
      -->{{val/delimitnum/whole|{{#expr:abs({{{1|0}}})}}}}<!---
+
}}</includeonly><noinclude>{{documentation}}</noinclude>
 
 
        -->|<!--
 
                The number is not an integer.
 
                Split the number into an integer part an a fractional part.
 
                Format the integer part using (a) thin space(s) for grouping digits.
 
                Add a decimal point.
 
 
 
        -->{{val/delimitnum/whole|{{#expr:trunc(abs({{{1|0}}}))}}}}.<!-- 
 
 
 
                Format the fractional part using (a) thin space(s) for grouping digits.
 
 
 
        -->{{val/delimitnum/fraction<!--
 
          -->|{{#expr:abs({{{1|0}}}1)-trunc(abs({{{1|0}}}1))}}<!--
 
                The fractional part (appended with an extra digit 1
 
                to avoid roundoff error on last displayed digit)
 
          -->|{{#expr:(-ln(abs({{{1|0}}}1)-abs({{{1|0}}}))/ln10round 0)-1}}<!--
 
                The number of decimals to display (the difference of absolute values is
 
                the value of the appended digit 1, its log10 gives its position)
 
          -->|nocategory={{{nocategory|}}}<!--
 
                category if formatting error (too many digits)
 
        -->}}<!--
 
    -->}}<!--
 
 
 
                Format using commas to the left.
 
 
 
                Test whether the number is an integer.
 
     -->|{{#ifexpr:trunc({{{1|0}}}9)={{{1|0}}}9
 
          |<!--
 
                The number is an integer.
 
                Format with commas.
 
        -->{{formatnum:{{#expr:abs{{{1}}}}}}}
 
          |<!--
 
                The number is not an integer.
 
                Format the whole part with commas.
 
        -->{{formatnum:{{#expr:trunc(abs{{{1}}})}}}}<!--
 
 
 
                Add trailing zeros.
 
        -->{{padright:<!--
 
 
 
                Remove the leading zero from the truncated number.
 
            -->{{#Invoke:String<!--
 
              -->|sub<!--
 
              -->|{{#expr:abs({{{1|0}}})-trunc(abs({{{1|0}}}))}}<!--
 
              -->|2<!--
 
            -->}}<!--  END invoke string
 
          -->|<!--
 
 
 
                Calculate the total number of characters to display
 
                (including the decimal point
 
            -->{{#expr:(-ln(abs({{{1|0}}}1)-abs({{{1|0}}}))/ln10round 0)}}<!--
 
 
 
        -->}}<!-- END padright
 
       -->}}<!-- END integer test
 
  -->}}<!-- END formatting commas vs gaps
 
-->}}</includeonly><noinclude>{{documentation}}</noinclude>
 

Latest revision as of 09:37, 30 September 2020

Template documentation[create]