Template:Val/delimitnum: Difference between revisions

From Zoophilia Wiki
Jump to navigationJump to search
meta>SkyLined
Reverted to revision 431613366 by Jason Quinn: Bad changes caused errors in negative numbers. (TW)
Ookami (talk | contribs)
m 42 revisions imported
 
(22 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<includeonly><!--
<includeonly><!--
-->{{#ifexpr:({{{1|0}}}1)=({{{1|0}}})|<!-- Test loss of precision by appending a fixed digit "1"
-->{{#ifeq: <!-- compare "04" to 4, and if so, output 4-digits pure
   -->{{FormattingError|Too Many Digits|nocategory={{{nocategory|}}}}}<!--
   What might be "04" is composed of three outputs: dot, len, and fmt -->
-->|<!-- No loss of precision, can display this number
  {{#invoke:String|find|{{{1}}}|.}}<!-- Output the zero if no dot.
  -->{{#ifexpr:{{{1|0}}}<0|&minus;}}<!-- Output the mathematical minus sign (not the minus-hyphen) if negative
  -->{{#invoke:String|len <!-- Length of 4 with sign and spaces filtered? -->
  -->{{#ifexpr:abs({{{1|0}}}1)>10*abs({{{1|0}}})|<!-- Number is an integer (no dot): appending a non-zero digit multiplies it by more than 10
    |{{#invoke:String|replace|{{{1}}}|[-+ ]|plain=false}}}}<!--  
    -->{{formatnum:{{#expr:abs({{{1|0}}})}}}}<!-- Format the integer using locale's separator for grouping digits
    That replace just filtered out any and all spaces, + or - characters.
   -->|<!-- Number is not an integer (at least contains a dot)
    But it's gotta have the minus sign first in the [-charclass].
    -->{{formatnum:{{#expr:trunc(abs({{{1|0}}}))}}.}}<!-- Format the integer part using locale's separator for grouping digits, followed by the locale's separator before fractional decimals
    Any fmt given?  If so comparison to "4" will fail -->{{{fmt|}}}
    -->{{val/delimitnum/fraction<!--
| 4 |{{#invoke:String|replace|{{{1}}}|-|&minus;}}<!--  
      -->|{{#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)
If fmt is nil, found . is 0, and filtered len is 4, then 04=4,
      -->|{{#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)
and we have just output the number, replacing any - with a minus sign
       -->|nocategory={{{nocategory|}}}<!-- category if formatting error (too many digits)
 
    -->}}<!--
Else:  
  -->}}<!--
-->|{{#switch: <!-- its not a pure 4-digit number with no fmt options given-->
-->}}</includeonly><noinclude>{{documentation}}</noinclude>
{{#invoke:String|sub|{{{1|0}}}|1|1}}
  <!-- If the first char is ... -->
 
   |- <!-- ... one kind of dash, or another -->
  |− = {{#ifeq:{{{nosign|off}}}|off|−}}<!-- output a &minus; sign unless nosign
    -->{{#ifeq:
          {{#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}}}}
  }}  
 
  <!-- follow same logic for leading + char -->
  |+={{#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}}}}}
    }}
 
  <!-- Else if first char is not . or - or + -->
  |#default = {{#switch:{{{fmt}}}
    |commas={{formatnum:{{{1|0}}}}}
    |#default = {{#invoke:Gapnum|main|{{{1|0}}}}}
      }}
  }}
}}</includeonly><noinclude>{{documentation}}</noinclude>

Latest revision as of 13:41, 3 September 2020