Getting the number of decimal places: Difference between revisions

m
→‎{{header|Phix}}: use pygments
m (→‎{{header|Phix}}: use pygments)
 
(18 intermediate revisions by 10 users not shown)
Line 1:
{{draft task}}
;Task:
Write a program (function) to get the number of decimalsdecimal places in a given number.
 
 
Line 15:
{{trans|Python}}
 
<langsyntaxhighlight lang="11l">F dec(n)
R I ‘.’ C n {n.split(‘.’).last.len} E 0
 
print(dec(‘12.345’))
print(dec(‘12.3450’))</langsyntaxhighlight>
 
{{out}}
Line 29:
=={{header|Action!}}==
{{libheader|Action! Tool Kit}}
<langsyntaxhighlight Actionlang="action!">INCLUDE "D2:REAL.ACT" ;from the Action! Tool Kit
 
BYTE FUNC FindC(CHAR ARRAY s CHAR c)
Line 100:
ValR("1.E-10",r) Test(r)
ValR("1.23456789E10",r) Test(r)
RETURN</langsyntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Getting_the_number_of_decimals.png Screenshot from Atari 8-bit computer]
Line 114:
1.23456789E+10 has 0 decimals
</pre>
 
=={{header|Ada}}==
 
<syntaxhighlight lang="ada">
-- Report the number of decimal places in a number
-- J. Carter 2023 Apr
-- I presume the input is a String containing the image of the value; the test values of 12.345 & 12.3450 represent the same number,
-- and so would give the same result otherwise
 
with Ada.Strings.Fixed;
with Ada.Text_IO;
 
procedure Decimal_Places is
function Num_Places (Number : in String) return Natural;
-- Returns the number of decimal places in the numeric image in Number
function Num_Places (Number : in String) return Natural is
Dot : constant Natural := Ada.Strings.Fixed.Index (Number, ".");
begin -- Num_Places
if Dot = 0 then
return 0;
end if;
return Number'Last - Dot;
end Num_Places;
Test_1 : constant String := "12.345";
Test_2 : constant String := "12.3450";
begin -- Decimal_Places
Ada.Text_IO.Put_Line (Item => Test_1 & (1 .. 10 - Test_1'Length => ' ') & Num_Places (Test_1)'Image);
Ada.Text_IO.Put_Line (Item => Test_2 & (1 .. 10 - Test_2'Length => ' ') & Num_Places (Test_2)'Image);
end Decimal_Places;
</syntaxhighlight>
 
{{out}}
<pre>
12.345 3
12.3450 4
</pre>
 
=={{header|Arturo}}==
 
<syntaxhighlight lang="arturo">nofDecimals: function [n][
str: (string? n)? -> n -> to :string n
size last split.by:"." str
]
 
loop [12 12.345 "12.3450" 12.34567] 'n ->
print ["number of decimals of" n "->" nofDecimals n]</syntaxhighlight>
 
{{out}}
 
<pre>number of decimals of 12 -> 2
number of decimals of 12.345 -> 3
number of decimals of 12.3450 -> 4
number of decimals of 12.34567 -> 5</pre>
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">for i, v in [10, "10", 12.345, "12.345", 12.3450, "12.3450"]
output .= v " has " StrLen(StrSplit(v, ".").2) " decimals.`n"
MsgBox % output</langsyntaxhighlight>
{{out}}
<pre>10 has 0 decimals.
Line 128 ⟶ 184:
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
<lang AWK>
# syntax: GAWK -f GETTING_THE_NUMBER_OF_DECIMALS.AWK
BEGIN {
Line 139 ⟶ 195:
exit(0)
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 150 ⟶ 206:
 
=={{header|C}}==
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <string.h>
 
int findNumOfDec(doubleconst xchar *s) {
charint buffer[128]pos = 0;
intwhile (s[pos,] num;&& s[pos++] != '.') {}
return strlen(s + pos);
 
sprintf(buffer, "%.14f", x);
 
pos = 0;
num = 0;
while (buffer[pos] != 0 && buffer[pos] != '.') {
pos++;
}
if (buffer[pos] != 0) {
pos++; // skip over the decimal
while (buffer[pos] != 0) {
pos++; // find the end of the string
}
pos--; //reverse past the null sentiel
while (buffer[pos] == '0') {
pos--; // reverse past any zeros
}
while (buffer[pos] != '.') {
num++;
pos--; // only count decimals from this point
}
}
return num;
}
 
void test(doubleconst xchar *s) {
int num = findNumOfDec(xs);
printf("%fconst haschar %d*p decimals\n", x,= num) != 1 ? "s" : "";
printf("%s has %d decimal%s\n", s, num, p);
}
 
int main() {
test("12.0");
test("12.3450");
test("12.345555555555345");
test("12.3450345555555555");
test("12.345555555555555555553450");
test(1"12.2345e+5434555555555555555555");
char str[64];
sprintf(str, "%f", 1.2345e+54);
test(str);
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>
<pre>12.000000 has 0 decimals
12.345000 has 30 decimals
12.3455560 has 121 decimalsdecimal
12.345000345 has 3 decimals
12.345556345555555555 has 1412 decimals
12.3450 has 4 decimals
1234500000000000060751116919315055127939946206157864960.000000 has 0 decimals</pre>
12.34555555555555555555 has 20 decimals
1234500000000000060751116919315055127939946206157864960.000000 has 6 decimals
</pre>
 
=={{header|C++}}==
{{trans|C}}
<langsyntaxhighlight lang="cpp">#include <iomanipiostream>
#include <iostreamcstring>
#include <sstream>
 
int findNumOfDec(doubleconst xchar *s) {
int pos = 0;
std::stringstream ss;
while (s[pos] && s[pos++] != '.') {}
ss << std::fixed << std::setprecision(14) << x;
return strlen(s + pos);
 
auto s = ss.str();
auto pos = s.find('.');
if (pos == std::string::npos) {
return 0;
}
 
auto tail = s.find_last_not_of('0');
 
return tail - pos;
}
 
void test(doubleconst xchar *s) {
std::coutint <<num x << " has " <<= findNumOfDec(xs) << " decimals\n";
const char *p = num != 1 ? "s" : "";
std::cout << s << " has " << num << " decimal" << p << "\n";
}
 
int main() {
test("12.0");
test("12.3450");
test("12.345555555555345");
test("12.3450345555555555");
test("12.345555555555555555553450");
test(1"12.2345e+5434555555555555555555");
char str[64];
sprintf(str, "%f", 1.2345e+54);
test(str);
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>12 has 0 decimals
12 has 0 decimals
12.0 has 1 decimal
12.345 has 3 decimals
12.3456345555555555 has 12 decimals
12.3453450 has 34 decimals
12.345634555555555555555555 has 1420 decimals
1234500000000000060751116919315055127939946206157864960.000000 has 6 decimals
1.2345e+54 has 0 decimals</pre>
</pre>
 
=={{header|EasyLang}}==
<syntaxhighlight>
func ndec n .
while abs (n - floor (n + 1e-15)) > 1e-15
n *= 10
r += 1
.
return r
.
for i in [ 0.00000000000001 12.345 12.3450 1.1 0.1234567 ]
write ndec i & " "
.
</syntaxhighlight>
{{out}}
<pre>
14 3 3 1 7
</pre>
 
=={{header|F_Sharp|F#}}==
<syntaxhighlight lang="fsharp">
//Getting the number of decimal places. Nigel Galloway: March 23rd., 2023.
let fN g=let n,g=Seq.length g,g|>Seq.tryFindIndex((=)'.') in match g with Some g->n-g-1 |_->0
["12";"12.00";"12.345";"12.3450";"12.34500"]|>List.iter(fN>>printfn "%d")
</syntaxhighlight>
{{out}}
<pre>
0
2
3
4
5
</pre>
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">Function dec(n As Double) As Uinteger
Dim As String c = Str(n)
Return Iif(Instr(c, "."), Len(Mid(c,Instr(c, ".")+1)), 0)
Line 256 ⟶ 328:
Print n(i); " has "; dec(n(i)); " decimals"
Next i
Sleep</langsyntaxhighlight>
{{out}}
<pre> 7 has 0 decimals
Line 263 ⟶ 335:
12.345677 has 6 decimals
0.142857142857142 has 15 decimals</pre>
 
 
=={{header|Go}}==
{{trans|Wren}}
<langsyntaxhighlight lang="go">package main
 
import (
Line 328 ⟶ 399:
}
}
}</langsyntaxhighlight>
 
{{out}}
Line 340 ⟶ 411:
</pre>
=={{Header|Haskell}}==
<langsyntaxhighlight Haskelllang="haskell">decimal :: String -> Int
decimal [] = 0
decimal ('.':xs) = length xs
Line 348 ⟶ 419:
numDecimal = decimal . show
 
main = print . map numDecimal $ [12.0, 12.345, 12.3450, 12.345555555555, 12.34555555555555555555, 1.2345e+54]</langsyntaxhighlight>
{{out}}
<pre>[1,3,3,12,15,7]</pre>
=={{header|Java}}==
<syntaxhighlight lang="java">
<lang java>public static int findNumOfDec(double x){
int decimalPlaces(double value) {
String string = String.valueOf(value);
return string.length() - (string.indexOf('.') + 1);
}
</syntaxhighlight>
Or
<syntaxhighlight lang="java">public static int findNumOfDec(double x){
String str = String.valueOf(x);
if(str.endsWith(".0")) return 0;
else return (str.substring(str.indexOf('.')).length() - 1);
}</langsyntaxhighlight>
 
=={{header|jq}}==
The current (March 2023) official releases of jq, gojq, fq, and jaq cannot be relied upon
to preserve the literal form of numbers, and in particular they drop the
final 0 of `12.3450` when presented as a number. However, the current "master" version of jq retains
the literal form of numbers. Accordingly, both the numeric and the string forms of 12.3450 are included in the suite of test
cases, and two sets of results are presented below.
<syntaxhighlight lang=jq>
def number_decimal_digits:
. as $in
| def nil: . == null or . == "";
def nodecimal: # e.g. 12 or 12e-2
capture("^[-+]?[0-9]*([eE](?<sign>[-+]?)(?<p>[0-9]+))?$")
| if .sign|nil then 0
elif .p|nil then "internal error: \($in)"|error
else .p|tonumber
end;
tostring
| nodecimal
// capture("^[-+]?[0-9]*[.](?<d>[0-9]+)([eE](?<sign>[-+]?)(?<p>[0-9]+))?$") # has decimal
// null
| if type == "number" then .
elif not then 0
elif .d|nil then 0
elif (.sign|nil) and .p == null then .d|length
elif (.sign|nil) or .sign == "+" then [0, (.d|length) - (.p|tonumber)] | max
elif .sign == "-" then (.d|length) + (.p|tonumber)
else "internal error: \($in)"|error
end ;
 
def examples:
[12.345, 3],
[12.3450, 4],
["12.3450", 4],
[1e-2, 2],
[1.23e2, 0];
 
def task:
examples
| (first|number_decimal_digits) as $d
| if $d == last then empty
else "\(first) has \(last) decimal places but the computed value is \($d)"
end;
 
task, "Bye."
</syntaxhighlight>
{{output}}
Using gojq:
<pre>
12.345 has 4 decimal places but the computed value is 3
Bye.
</pre>
Using jq post-1.6:
<pre>
Bye.
</pre>
 
 
=={{header|Julia}}==
<langsyntaxhighlight lang="julia">function postprecision(str::String)
s = lowercase(str)
if 'e' in s
Line 380 ⟶ 515:
println("$n has $(postprecision(n)) decimals.")
end
</langsyntaxhighlight>{{out}}
<pre>
0.00100 has 5 decimals.
Line 399 ⟶ 534:
=={{header|Kotlin}}==
{{trans|Java}}
<langsyntaxhighlight lang="scala">fun findNumOfDec(x: Double): Int {
val str = x.toString()
if (str.endsWith(".0")) {
Line 411 ⟶ 546:
println("%f has %d decimals".format(n, findNumOfDec(n)))
}
}</langsyntaxhighlight>
{{out}}
<pre>12.000000 has 0 decimals
Line 425 ⟶ 560:
A first answer could be
 
<syntaxhighlight lang="scheme">
<lang Scheme>
{W.length
{S.rest
{S.replace \. by space in 12.3450}}}
-> 4
</syntaxhighlight>
</lang>
 
This is a better one, if considering that ending zeroes should not be considered as decimals
 
<syntaxhighlight lang="schema">
<lang Schema>
{def decimals
{def decimals.r
Line 451 ⟶ 586:
{decimals 12.34560001230000}
-> 10
</syntaxhighlight>
</lang>
Numbers can be of any size.
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">ClearAll[DecimalDigits]
DecimalDigits[r_String] := Module[{pos},
If[StringContainsQ[r, "."],
Line 469 ⟶ 604:
DecimalDigits["3128"]
DecimalDigits["13."]
DecimalDigits["13.1312312"]</langsyntaxhighlight>
{{out}}
<pre>3
Line 480 ⟶ 615:
=={{header|Perl}}==
Need pragma <code>bignum</code> to handle decimals beyond 15 digits.
<langsyntaxhighlight lang="perl">use bignum;
 
printf "Fractional precision: %2s Number: %s\n", length((split /\./, $_)[1]) // 0, $_
for 9, 12.345, <12.3450>, 0.1234567890987654321, 1/3, 1.5**63;</langsyntaxhighlight>
{{out}}
<pre>Fractional precision: 0 Number: 9
Line 493 ⟶ 628:
 
=={{header|Phix}}==
<!--<lang Phix>(phixonline)-->
<syntaxhighlight lang="phix">
<span style="color: #008080;">constant</span> <span style="color: #000000;">fracfmt</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">machine_bits</span><span style="color: #0000FF;">()=</span><span style="color: #000000;">32</span><span style="color: #0000FF;">?</span><span style="color: #008000;">"%.14g"</span><span style="color: #0000FF;">:</span><span style="color: #008000;">"%.18g"</span><span style="color: #0000FF;">)</span>
constant fracfmt = iff(machine_bits()=32?"%.14g":"%.18g")
<span style="color: #008080;">function</span> <span style="color: #000000;">num_decimals</span><span style="color: #0000FF;">(</span><span style="color: #004080;">object</span> <span style="color: #000000;">o</span><span style="color: #0000FF;">)</span>
function num_decimals(object o)
<span style="color: #004080;">integer</span> <span style="color: #000000;">nd</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span>
integer nd = -1
<span style="color: #004080;">string</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">t</span>
string s, t
<span style="color: #008080;">if</span> <span style="color: #004080;">integer</span><span style="color: #0000FF;">(</span><span style="color: #000000;">o</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
if integer(o) then
<span style="color: #000000;">nd</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
nd = 0
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">o</span><span style="color: #0000FF;">)</span>
s = sprintf("%d",o)
<span style="color: #008080;">elsif</span> <span style="color: #004080;">atom</span><span style="color: #0000FF;">(</span><span style="color: #000000;">o</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
elsif atom(o) then
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%.19g"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">o</span><span style="color: #0000FF;">)</span>
s = sprintf("%.19g",o)
<span style="color: #000000;">o</span> <span style="color: #0000FF;">-=</span> <span style="color: #7060A8;">trunc</span><span style="color: #0000FF;">(</span><span style="color: #000000;">o</span><span style="color: #0000FF;">)</span>
o -= trunc(o)
<span style="color: #008080;">if</span> <span style="color: #000000;">o</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
if o=0 then
<span style="color: #000000;">nd</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
<span style nd ="color: #008080;">else</span>0
else
<span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fracfmt</span><span style="color: #0000FF;">,</span><span style="color: #000000;">o</span><span style="color: #0000FF;">)</span>
t = sprintf(fracfmt,o)
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end if
<span style="color: #008080;">elsif</span> <span style="color: #004080;">string</span><span style="color: #0000FF;">(</span><span style="color: #000000;">o</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
elsif string(o) then
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">o</span>
s = o
<span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span>
t = s
<span style="color: #008080;">else</span>
else
<span style="color: #7060A8;">crash</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"unknown type"</span><span style="color: #0000FF;">)</span>
crash("unknown type")
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end if
<span style="color: #008080;">if</span> <span style="color: #000000;">nd</span><span style="color: #0000FF;">=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
if nd=-1 then
<span style="color: #004080;">integer</span> <span style="color: #000000;">e</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'e'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">t</span><span style="color: #0000FF;">)</span>
integer e = find('e',t)
<span style="color: #008080;">if</span> <span style="color: #000000;">e</span> <span style="color: #008080;">then</span>
if e then
<span style="color: #0000FF;">{</span><span style="color: #000000;">t</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">t</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">e</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span><span style="color: #7060A8;">to_number</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">[</span><span style="color: #000000;">e</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$])}</span>
{t,e} = {t[1..e-1],to_number(t[e+1..$])}
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end if
<span style="color: #004080;">integer</span> <span style="color: #000000;">dot</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'.'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">t</span><span style="color: #0000FF;">)</span>
integer dot = find('.',t)
<span style="color: #000000;">nd</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dot</span><span style="color: #0000FF;">?</span><span style="color: #7060A8;">max</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">dot</span><span style="color: #0000FF;">-</span><span style="color: #000000;">e</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">):</span><span style="color: #7060A8;">max</span><span style="color: #0000FF;">(-</span><span style="color: #000000;">e</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">))</span>
nd = iff(dot?max(length(t)-dot-e,0):max(-e,0))
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end if
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">shorten</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"digits"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">)</span>
s = shorten(s,"digits",5)
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">nd</span><span style="color: #0000FF;">}</span>
return {s,nd}
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
end function
<span style="color: #004080;">sequence</span> <span style="color: #000000;">tests</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"0.00100"</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.00100</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">001.805</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">/</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">12</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">12.345</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">12.345555555555</span><span style="color: #0000FF;">,</span>
sequence tests = {"0.00100", 0.00100, 001.805, 1/3, 12, 12.345, 12.345555555555,
<span style="color: #008000;">"12.3450"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"12.34555555555555555555"</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">12.345e53</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.2345e-08</span><span style="color: #0000FF;">,</span>
"12.3450", "12.34555555555555555555", 12.345e53, 1.2345e-08,
<span style="color: #008000;">"12.345e53"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1.2345e-08"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"0.1234567890987654321"</span><span style="color: #0000FF;">,</span>
"12.345e53", "1.2345e-08", "0.1234567890987654321",
<span style="color: #008000;">"124093581919.648947697827373650380188008224280338254175148904323577880859375"</span><span style="color: #0000FF;">}</span>
"124093581919.648947697827373650380188008224280338254175148904323577880859375"}
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
for i=1 to length(tests) do
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%25s has %d decimals\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">num_decimals</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]))</span>
printf(1,"%25s has %d decimals\n",num_decimals(tests[i]))
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for
<!--</lang>-->
</syntaxhighlight>
{{out}}
32 bit
Line 563 ⟶ 699:
=={{header|Python}}==
Treated as a function over a string representation of a number to allow the capturing of significant trailing zeros.
<langsyntaxhighlight lang="python">In [6]: def dec(n):
...: return len(n.rsplit('.')[-1]) if '.' in n else 0
 
Line 572 ⟶ 708:
Out[8]: 4
 
In [9]: </langsyntaxhighlight>
 
 
Or, defining a slightly less partial function, over a given number, rather than a string:
 
<langsyntaxhighlight lang="python">'''Report the decimal counts in default stringifications.'''
 
import math
Line 685 ⟶ 821:
# MAIN ---
if __name__ == '__main__':
main()</langsyntaxhighlight>
{{Out}}
<pre>Decimal counts in stringifications of real and imaginary components:
Line 710 ⟶ 846:
want to retain them, you need to pass the value as a string. (As below.)
 
<syntaxhighlight lang="raku" perl6line>use Rat::Precise;
 
printf "Fractional precision: %-2s || Number: %s\n", (.split('.')[1] // '').chars, $_
for 9, 12.345, '12.3450', 0.1234567890987654321, (1.5**63).precise;
</syntaxhighlight>
</lang>
{{out}}
<pre>Fractional precision: 0 || Number: 9
Line 731 ⟶ 867:
 
Any number specified in exponential notation is first converted to a whole or fractional integer &nbsp; (or an integer with scale), <br>and &nbsp;that&nbsp; number is then examined.
<langsyntaxhighlight lang="rexx">/*REXX pgm counts number of decimal digits which are to the right of the decimal point. */
numeric digits 1000 /*ensure enuf dec digs for calculations*/
@.=; /*initialize a stemmed array to nulls. */
Line 765 ⟶ 901:
end
parse var x '.' fract /*parse number, get the fractional part*/
return length(fract) /*return number of fractional digits. */</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the default inputs:}}
<pre>
Line 783 ⟶ 919:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
# Testing the function
decimals(2) # Unsensitive to the default setting of decimals
Line 804 ⟶ 940:
ok
end
</syntaxhighlight>
</lang>
{{out}}
<pre>
4
</pre>
 
'''Another version'''
<syntaxhighlight lang="ring">
decimals(4)
num = 5.1945
strnum = string(num)
pos = substr(strnum,".")
dec = len(strnum) - pos
see "Number of decimals: " + dec + nl
</syntaxhighlight>
{{out}}
<pre>
Number of decimals: 4
</pre>
 
=={{header|RPL}}==
≪ DUP MANT →STR SIZE SWAP XPON - 2 - 0 MAX
≫ ''''NDEC'''' STO
≪ { 12 120 12.345 12.345677 1.23E-20 1.23E20 } → cases
≪ { } 1 cases SIZE '''FOR''' j
cases j GET '''NDEC''' + '''NEXT'''
≫ ≫ ''''TASK'''' STO
{{out}}
<pre>
1: { 0 0 3 6 22 0 }
</pre>
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">func number_of_decimals(n, limit = 1e5) {
var prec = Num(Num!PREC)>>2
var prev = ''
Line 839 ⟶ 1,002:
var c = number_of_decimals(n)
say "Number of decimals: #{'%3s' % c} Number: #{n}"
}</langsyntaxhighlight>
 
{{out}}
Line 858 ⟶ 1,021:
 
Converting the fourth example to a Rat or BigRat object wouldn't help as the constructor for those classes automatically reduces the numerator and denominator to their lowest terms. BigRat would work for the fifth example but the argument would have to be passed as a string anyway so we might as well just parse the string.
<langsyntaxhighlight ecmascriptlang="wren">var error = "Argument must be a number or a decimal numeric string."
 
var getNumDecimals = Fn.new { |n|
Line 881 ⟶ 1,044:
var ns = (n is String) ? "\"%(n)\"" : "%(n)"
System.print("%(ns) has %(d) decimals")
}</langsyntaxhighlight>
 
{{out}}
7,805

edits