Movatterモバイル変換


[0]ホーム

URL:


Jump to content
Rosetta Code
Search

Formatted numeric output

From Rosetta Code
Task
Formatted numeric output
You are encouraged tosolve this task according to the task description, using any language you may know.
Task

Express a number in decimal as a fixed-length string with leading zeros.


For example, the number  7.125   could be expressed as  00007.125.

11l

print(‘#05.3’.format(7.125))
Output:
00007.125

8086 Assembly

ThePrintString andPrintChar routines was omitted to keep this short. They handle the printing of null-terminated strings.

As an added bonus, this program supports trailing zeroes, but since the example didn't have any it won't get run.

.modelsmall.stack1024.data;data segment is unused in this program.codestart:movax,@codemovds,axmoves,axcld;make lodsb, etc. auto-incrementmoval,byteptr[ds:LeadingZeroes]movcl,almovch,0moval,'0';30hjcxzDonePrintingLeadingZeroes;there are leading zeroes so we won't skip that section. This branch is not taken.printLeadingZeroes:callPrintChar;print ascii 0 to the terminal 4 timesloopprintLeadingZeroesDonePrintingLeadingZeroes:movsi,offsetTestStringcallPrintStringmoval,byteptr[ds:TrailingZeroes]movcl,almovch,0moval,'0';30hjcxzDonePrintingTrailingZeroes;there are none in this example so this branch is always takenprintTrailingZeroes:callPrintCharloopprintTrailingZeroesDonePrintingTrailingZeroes:movax,4C00hint21h;exit to DOSTestStringbyte"7.125",0LeadingZeroesbyte4;number of leading zeroes to printTrailingZeroesbyte0;number of trailing zeroes to print
Output:
C:\>prog.exe00007.125C:\>_

8th

7.125"%09.3f"s:strfmt.cr
Output:
 00007.125

AArch64 Assembly

Works with:as version Raspberry Pi 3B version Buster 64 bits
/* ARM assembly AARCH64 Raspberry PI 3B *//*  program formatNum64.s   *//* use C library printf  ha, ha, ha !!! *//*******************************************//* Constantes file                         *//*******************************************//* for this file see task include a file in language AArch64 assembly*/.include "../includeConstantesARM64.inc"/*******************************************//* Initialized data                        *//*******************************************/.dataszFormat1:         .asciz " %09.3f\n".align 4sfNumber:          .double  0f-7125E-3sfNumber1:         .double  0f7125E-3/*******************************************//* UnInitialized data                      *//*******************************************/.bss .align 4/*******************************************//*  code section                           *//*******************************************/.text.global main main:                                   // entry of program     ldr x0,qAdrszFormat1                // format    ldr x1,qAdrsfNumber                 // float number address    ldr d0,[x1]                         // load float number in d0    bl printf                           // call C function !!!    ldr x0,qAdrszFormat1    ldr x1,qAdrsfNumber1    ldr d0,[x1]    bl printf 100:                                    // standard end of the program    mov x0,0                            // return code    mov x8,EXIT                         // request to exit program    svc 0                               // perform the system call qAdrszFormat1:           .quad szFormat1qAdrsfNumber:            .quad sfNumberqAdrsfNumber1:           .quad sfNumber1
Output:
 -0007.125 00007.125

Ada

withAda.Text_Io.Editing;useAda.Text_Io.Editing;withAda.Text_Io;useAda.Text_Io;procedureZero_FillisPic_String:String:="<999999.99>";Pic:Picture:=To_Picture(Pic_String);typeMoneyisdelta0.01digits8;packageMoney_Outputis newDecimal_Output(Money);useMoney_Output;Value:Money:=37.25;beginPut(Item=>Value,Pic=>Pic);endZero_Fill;
Output:
 000037.25

Aime

o_form("/w9s0/\n", 7.125);o_form("/w12d6p6/\n", -12.0625);o_form("/w12d6p6/\n", 7.125);
Output:
00007.125  -12.0625      7.125

ALGOL 68

Using formatted transput

Translation of:C

Should work with any ALGOL 68 implementation that implements formatted transput.
Note that when using real patterns, if exponent frames are used, the exponent pattern must specify enough digits for the exponent and if it is negative the exponent pattern must have a sign.

#main:# (  REAL r=exp(pi)-pi;  print((r,newline));  printf(($g(-16,4)l$,-r));  printf(($g(-16,4)l$,r));  printf(($g( 16,4)l$,r));  printf(($g( 16,4,1)l$,r));  printf(($-dddd.ddddl$,-r));  printf(($-dddd.ddddl$,r));  printf(($+dddd.ddddl$,r));  printf(($ddddd.ddddl$,r));  printf(($zzzzd.ddddl$,r));  printf(($zzzz-dd.ddddl$,-r));  printf(($zzzz-dd.dddde-ddl$,-r));  printf(($zz-d.dddde+ddl$,-r));  printf(($4z-d.4de+4dl$,r)))
Output:
+1.99990999791895e  +1        -19.9991         19.9991        +19.9991+19999099.979e-6-0019.9991 0019.9991+0019.999100019.9991   19.9991    -19.9991-199990.9998e-04-199.9910e-01 19999.1000e-0003

Without formatted transput

For implementations of Algol 68 that don't have formatted transput, the output from the previous sample can be reproduced using thefixed andfloat standard prelude routines.
For the cases where leading zeros are required or partial suppression of leading zeros is wanted, some procedures or operators could be defined to modify the output fromfixed andfloat - possible suitable operators are implemented here.

(  OP UNSUPPRESS = ( STRING v )STRING: # replace leading spaces with zeros #     IF   LWB v > UPB v     THEN v # empty string #     ELSE STRING result := v;          INT    p1     := LWB result;          IF result[ p1 ] = " " THEN result[ p1 ] := "0" FI;          FOR p FROM LWB result + 1 TO UPB result DO              CHAR c = result[ p ];              IF   c = " "            THEN result[ p ] := "0"              ELIF c = "-" OR c = "+" THEN result[ p ] := "0"; result[ p1 ] := c              ELIF c = "e"            THEN p1 := p + 1              FI          OD;          result     FI # UNSUPPRESS # ;  OP SUPPRESSPLUS = ( STRING v )STRING: # replace leading space/zero with "+" #     IF LWB v > UPB v THEN v ELIF CHAR c = v[ LWB v ]; c = "+" OR c = "0" THEN " " + v[ LWB v + 1 : ] ELSE v FI;  PRIO SUPPRESS = 5; # suppress up to d leading zeros #  OP   SUPPRESS = ( STRING v, INT d )STRING:       IF   LWB v > UPB v       THEN v       ELIF CHAR c1 = v[ LWB v ]; c1 /= "+" AND c1 /= "-" AND c1 /= "0"       THEN v       ELSE INT  len   = ( UPB v - LWB v ) + 1;            INT  max p = ( LWB v - 1 ) + IF len > d THEN d ELSE len FI;            STRING result := v;            CHAR sign char = IF c1 = "0" THEN " " ELSE c1 FI;            result[ LWB result ] := " ";            BOOL inserted sign   := FALSE;            FOR p FROM LWB result + 1 TO max p            WHILE CHAR c = result[ p ];                  IF c /= "0" THEN result[ p - 1 ] := sign char; inserted sign := TRUE FI;                  NOT inserted sign            DO result[ p ] := " "            OD;            IF NOT inserted sign THEN result[ max p ] := sign char FI;            result       FI # SUPPRESS # ;               REAL r=exp(pi)-pi;  print((r,newline));  print((fixed(-r,16,4),newline));  print((fixed(r,-16,4),newline));  print((fixed(r,16,4),newline));  print((float(r,16,4,1),newline));  print((SUPPRESSPLUS UNSUPPRESS fixed(-r,-10,4),newline));  print((SUPPRESSPLUS UNSUPPRESS fixed(r,-10,4),newline));  print((UNSUPPRESS fixed(r,10,4),newline));  print((UNSUPPRESS fixed(ABS r,-10,4),newline));  print((fixed(ABS r,-10,4),newline));  print((SUPPRESSPLUS UNSUPPRESS fixed(-r,12,4) SUPPRESS 5,newline));  print((SUPPRESSPLUS UNSUPPRESS float(-r,16,4,-3) SUPPRESS 5,newline));  print((SUPPRESSPLUS UNSUPPRESS float(-r,-13,4,3),newline));  print((SUPPRESSPLUS UNSUPPRESS float(r,-17,4,5),newline)))
Output:

Same as the first sample.

Amazing Hopper

#include<basico.h>#proto padzeros(_X_,_S_,_D_)#proto padmoney(_N_,_D_,_F_,_S_,_P_)algoritmon={},'125,12.39802,0.0003221,-0.0045,457897.789'enlistaren'n'fijarseparador'NL'imprimir("Express a number in decimal as a fixed-length string with leading zeros:\n\n",\#(pad zeros(n,19,5)), "\n\n",\               #(pad zeros(n,19,0)), "\n\n",\               #(pad zeros( (-9873000155.584),19,1)), "\n\n",\               "Bonus track:\n\n",\               #(lpad( " ",20,string(n))), "\n\n",\               #(lpad( " ",20,notation(n))),"\n\n",\               #(pad money(n,1,".",19,"$")),"\n\n",\               #(pad money(1980.67,1,"_",16,"USD$"),NL))terminarsubrutinaspadzeros(n,l,d)decimales'd's=0,sgn=0#( s = string( n * sgn:=(sign(n)) ) )#( sgn = string(sgn) )si(s,esmatriz?)mapear(#(sgn=="-1"),"-",sgn)mapear(#(sgn=="1")," ",sgn)sino#(sgn=="-1"), entonces{ "-",mover a 'sgn' }#(sgn=="1"), entonces{ " ",mover a 'sgn' }finsi#(cat( sgn, lpad( "0",l,s)))decimalesnormalesretornarpadmoney(num,dec,fill,size,prefix)#(cat(prefix,lpad(fill,size,money(dec,num))))retornar
Output:
Express a number in decimal as a fixed-length string with leading zeros: 0000000000125.00000 0000000000012.39802 0000000000000.00032-0000000000000.00450 0000000457897.78900 0000000000000000125 0000000000000000012 0000000000000000000-0000000000000000000 0000000000000457898-00000009873000155.6Bonus track:                 125           12.398020            0.000322           -0.004500       457897.789000        1.250000e+02        1.239802e+01        3.221000e-04       -4.500000e-03        4.578978e+05$..............125.0$...............12.4$................0.0$...............-0.0$..........457,897.8USD$_________1,980.7

AmigaE

The function RealF can be used to convert a floating point value into a string, with a specified number of decimal digits. But to fit the string into a greater container prepending 0 we must write our own function. (The one here proposed has no a flag for the alignment of the result inside the containing string)

PROC newRealF(es, fl, digit, len=0, zeros=TRUE)  DEF s, t, i  IF (len = 0) OR (len < (digit+3))    RETURN RealF(es, fl, digit)  ELSE    s := String(len)    t := RealF(es, fl, digit)    FOR i := 0 TO len-EstrLen(t)-1 DO StrAdd(s, IF zeros THEN '0' ELSE ' ')    StrAdd(s, t)    StrCopy(es, s)    DisposeLink(s)    DisposeLink(t)  ENDIFENDPROC esPROC main()  DEF s[100] : STRING  WriteF('\s\n', newRealF(s, 7.125, 3,9))ENDPROC

APL

'ZF15.9'⎕FMT7.12500007.125000000

APL's⎕FMT is similar to C'sprintf (only it operates on arrays).

AppleScript

onfixedlength(x,max)ifx<0thensetprefto"-"setxto-xelsesetprefto""endifsetstoxastextsetminto(lengthofs)+(lengthofpref)repeatmax-mintimessetsto"0"&sendrepeatreturnpref&sendfixedlengthrepeatwithxin{7.125,-7.125,77.125,777.125}logfixedlength(x,9)endrepeat
Output:
(*00007.125*)(*-0007.125*)(*00077.125*)(*00777.125*)

ARM Assembly

Works with:as version Raspberry Pi
/* ARM assembly Raspberry PI  *//*  program formatNum.s   *//* use C library printf  ha, ha, ha !!! *//* Constantes               */.equ EXIT,   1                         @ Linux syscall/* Initialized data */.dataszFormat1:         .asciz " %09.3f\n".align 4sfNumber:          .double  0f-7125E-3sfNumber1:         .double  0f7125E-3/* UnInitialized data */.bss .align 4/*  code section */.text.global main main:                                   @ entry of program    push {fp,lr}                        @ saves registers    ldr r0,iAdrszFormat1                @ format    ldr r1,iAdrsfNumber                 @ number address    ldr r2,[r1]                         @ load first 4 bytes    ldr r3,[r1,#4]                      @ load last 4 bytes    bl printf                           @ call C function !!!    ldr r0,iAdrszFormat1    ldr r1,iAdrsfNumber1    ldr r2,[r1]    ldr r3,[r1,#4]    bl printf100:                                    @ standard end of the program    mov r0, #0                          @ return code    pop {fp,lr}                         @restaur  registers    mov r7, #EXIT                       @ request to exit program    swi 0                               @ perform the system calliAdrszFormat1:           .int szFormat1iAdrsfNumber:            .int sfNumberiAdrsfNumber1:           .int sfNumber1

Arturo

r:7.125printrprintto:string.format:"09.3f"r
Output:
7.12500007.125

AutoHotkey

contributed by Laszlo on the ahkforum

MsgBox%pad(7.25,7)  ; 0007.25MsgBox%pad(-7.25,7) ; -007.25pad(x,len){ ; pad with 0's from left to len charsIfLessx,0,Return"-"pad(SubStr(x,2),len-1)VarSetCapacity(p,len,Asc("0"))ReturnSubStr(px,1-len)}

AWK

BEGIN{r=7.125printf" %9.3f\n",-rprintf" %9.3f\n",rprintf" %-9.3f\n",rprintf" %09.3f\n",-rprintf" %09.3f\n",rprintf" %-09.3f\n",r}

Same output as the C code.

BASIC

Applesoft BASIC

0P=5:T=3:R=7.125:GOSUB100"FORMATTEDNUMERICOUTPUT9ENDREM FORMATTED NUMERIC OUTPUTREM     Given R a Real numberREM and P as left Padding amount, P$ as the PaddingREM and T as the Trailing amount, T$ as the Trailing padding100R$=STR$(R):L=LEN(R$):S$="":IFMID$(R$,1,1)=" "THENS$=" ":L=L-1:R$=RIGHT$(R$,L)110IFMID$(R$,1,1)="-"THENL=L-1:R$=RIGHT$(R$,L):S$=S$+"-":REMSIGN120LETD$="":D=0:E$="":E=0:REMDECIMAL,EXPONENTandPOSITIONS130IFP$=""THENP$="0":REMLEFTPADDING140IFT$=""THENT$="0":REMTRAILINGPADDING150FORI=1TOL160LETC$=MID$(R$,I,1)170IFC$="."THEND=I180IFC$="E"THENE=I190NEXTI200IFETHENE$=MID$(R$,E):R$=LEFT$(R$,E-1)210IFDTHEND$=MID$(R$,D+1):R$=LEFT$(R$,D-1)220LETPAD$="":FORI=1TOP:PAD$=P$+PAD$:NEXT230PRINTS$RIGHT$(PAD$+R$,P);240LETPAD$="":FORI=1TOT:PAD$=PAD$+T$:NEXT250IFTTHENPRINT"."LEFT$(D$+PAD$,T);260PRINTE$;270RETURN
Output:
00007.125

ANSI BASIC

Works with:Decimal BASIC
100REM Formatted numeric output110LETN=7.125120PRINTUSING("%%%%.###"):N130PRINTUSING("****.###"):N140PRINTUSING("####.###"):N150PRINTUSING("+%%%.###"):N160PRINTUSING("+%%%.###"):-N170PRINTUSING(".###^^^^^"):N180PRINTUSING("#.###^^^^^"):N190PRINTUSING("##.###^^^^^"):N200PRINTUSING("+.###^^^^^"):-N210END
Output:
 0007.125***7.125   7.125+007.125-007.125.713E+0017.125E+00071.250E-001-.713E+001

BaCon

BaCon can use C styleprintf format specifiers.

' Formatted numeric outputn=7.125PRINTnFORMAT"%09.3f\n"
Output:
prompt$ ./formatted00007.125

BBC BASIC

PRINTFNformat(PI,9,3)PRINTFNformat(-PI,9,3)ENDDEFFNformat(n,sl%,dp%)LOCAL@%@%=&1020000ORdp%<<8IFn>=0THEN=RIGHT$(STRING$(sl%,"0")+STR$(n),sl%)ENDIF="-"+RIGHT$(STRING$(sl%,"0")+STR$(-n),sl%-1)
Output:
00003.142-0003.142

BASIC256

n=7.125printrjust(string(n),8,"0")#=>00007.125printzfill(string(n),8)#=>00007.125

Chipmunk Basic

This example isin need of improvement:

It does not express numbers with unknown length as a fixed-length string (e.g. 777.125 or 77.125 result in too long string).

10printusing"0000#.###";7.125
Output:
00007.125

FreeBASIC

' FB 1.05.0 Win64#Include"vbcompat.bi"DimsAsString=Format(7.125,"00000.0##")PrintsSleep
Output:
00007.125

IS-BASIC

100 LET F=7.125110 PRINT USING "-%%%%%.###":F

Liberty BASIC

Custom function builds on the supplied 'print using( "###.###", n)'.
NB no check that this does not truncate high-order digits... and remember LB calculates with more figures than its normal 'print' displays.

for i = 1 to 10    n = rnd(1) * 10 ^ (int(10 * rnd(1)) - 2)    print "Raw number = "; n, "Using custom function = "; FormattedPrint$(n, 16, 5)next iendfunction FormattedPrint$(n, length, decPlaces)    format$ = "#."    for i = 1 to decPlaces        format$ = format$ + "#"    next i    n$ = using(format$, n)            '   remove leading spaces if less than 3 figs left of decimal                                        '   add leading zeros    for i = 1 to len(n$)        c$ = mid$(n$, i, 1)        if c$ = " " or c$ = "%" then nn$ = nn$ + "0" else nn$ = nn$ + c$    next i    FormattedPrint$ = right$( "000000000000" +nn$, length) '   chop to required lengthend function
Output:
Raw number = 0.92349667e-2  Using custom function = 0000000000.00923Raw number = 0.45244905     Using custom function = 0000000000.45245Raw number = 3084321.68     Using custom function = 0003084321.68220Raw number = 545.557351     Using custom function = 0000000545.55735Raw number = 765.455263     Using custom function = 0000000765.45526Raw number = 650413.092     Using custom function = 0000650413.09248Raw number = 0.85554345     Using custom function = 0000000000.85554Raw number = 296.155771     Using custom function = 0000000296.15577Raw number = 8.3816344      Using custom function = 0000000008.38163Raw number = 0.1007265e-2   Using custom function = 0000000000.00101

Nascom BASIC

Translation of:ZX Spectrum Basic
Works with:Nascom ROM BASIC version 4.7
10REM Formatted numeric output20CLS30LETN=7.12540LETW=950GOSUB100060SCREEN10,9:PRINTN$70END1000REM Formatted fixed-length1010N$=STR$(N):N$=RIGHT$(N$,LEN(N$)-1)1020FORI=1TOW-LEN(N$)1030N$="0"+N$1040NEXTI1050RETURN

PureBasic

Using RSet() to pad 7.125 with 3 decimals converted to a string, to 8 char length.

RSet(StrF(7.125,3),8,"0");Willbe0007.125

QBasic

Works with:QBasic version 1.1
Works with:QuickBasic version 4.5
n=7.125PRINTUSING("0000#.###");n' => 00007.125

Run BASIC

print right$("00000";using("#####.##",7.125),8) ' => 00007.13

SmallBASIC

printformat("00000.000",7.125)

TI-89 BASIC

This example isin need of improvement:

It does not handle negative numbers.

right("00000" & format(7.12511, "f3"), 9)

True BASIC

LETn=7.125PRINTUSING("0000#.###"):n!=>0007.125END

VBA

OptionExplicitSubMain()Debug.PrintfFormat(13,2,1230.3333)Debug.PrintfFormat(2,13,1230.3333)Debug.PrintfFormat(10,5,0.3333)Debug.PrintfFormat(13,2,1230)EndSubPrivateFunctionfFormat(NbIntAsInteger,NbDecAsInteger,NbAsDouble)AsString'NbInt : Lenght of integral part'NbDec : Lenght of decimal part'Nb : decimal on integer numberDimuAsString,vAsString,iAsIntegeru=CStr(Nb)i=InStr(u,Application.DecimalSeparator)Ifi>0Thenv=Mid(u,i+1)u=Left(u,i-1)fFormat=Right(String(NbInt,"0")&u,NbInt)&Application.DecimalSeparator&Left(v&String(NbDec,"0"),NbDec)ElsefFormat=Right(String(NbInt,"0")&u,NbInt)&Application.DecimalSeparator&String(NbDec,"0")EndIfEndFunction
Output:
0000000001230.3330.33330000000000000000000.333300000000001230.00

VBScript

Works with:Windows Script Host version *
a=1234.5678' Round to three decimal places. Groups by default. Output = "1,234.568".WScript.EchoFormatNumber(a,3)' Truncate to three decimal places. Output = "1234.567".WScript.EchoLeft(a,InStr(a,".")+3)' Round to a whole number. Grouping disabled. Output = "1235".WScript.EchoFormatNumber(a,0,,,False)' Use integer portion only and pad with zeroes to fill 8 chars. Output = "00001234".WScript.EchoRight("00000000"&Int(a),8)

Visual Basic

Works with:Visual Basic version VB6 Standard
Debug.PrintFormat$(7.125,"00000.000")

Output (the decimal separator used depends on the system's language settings):

00007.125

XBasic

Works with:Windows XBasic
PROGRAM"progname"VERSION"0.0000"DECLAREFUNCTIONEntry()FUNCTIONEntry()n!=7.125PRINTFORMAT$("0000#.###",n!)ENDFUNCTIONENDPROGRAM
Output:
00007.125

Yabasic

n=7.125printnusing("#####.###")//=>7.125printstr$(n,"%09.3f")//=>00007.125

ZX Spectrum Basic

10LETn=7.12520LETwidth=930GOSUB100040PRINTAT10,10;n$50STOP1000REM Formatted fixed-length1010LETn$=STR$n1020FORi=1TOwidth-LENn$1030LETn$="0"+n$1040NEXTi1050RETURN

bc

First define a custom function for numeric output.

/* * Print number n, using at least c characters. * * Different from normal, this function: *  1. Uses the current ibase (not the obase) to print the number. *  2. Prunes "0" digits from the right, so p(1.500, 1) prints "1.5". *  3. Pads "0" digits to the left, so p(-1.5, 6) prints "-001.5". *  4. Never prints a newline. * * Use an assignment, as t = p(1.5, 1), to discard the return value * from this function so that bc not prints the return value. */define p(n, c){auto d, d[], f, f[], i, m, r, s, vs=scale/* Save original scale. */if(n<0){"-"/* Print negative sign. */c-=1n=-n/* Remove negative sign from n. */}/* d[] takes digits before the radix point. */scale=0for(m= n/1; m!=0; m/=10) d[d++]= m%10/* f[] takes digits after the radix point. */r= n-(n/1)/* r is these digits. */scale=scale(n)f=-1/* f counts the digits of r. */for(m= r+1; m!=0; m/=10) f+=1scale=0r= r*(10^ f)/1/* Remove radix point from r. */if(r!=0){while(r%10==0){/* Prune digits. */f-=1r/=10}for(i=0; i< f; i++){f[i]= r%10r/=10}}/* Pad "0" digits to reach c characters. */c-= dif(f>0) c-=1+ ffor(1; c>0; c--)"0"/* Print "0". *//* i = index, m = maximum index, r = digit to print. */m= d+ ffor(i=1; i<= m; i++){if(i<= d) r= d[d- i]if(i> d) r= f[m- i]if(i== d+1)"."/* Print radix point. */v=0if(r== v++)"0"/* Print digit. */if(r== v++)"1"if(r== v++)"2"/* r == 2 might not work, */if(r== v++)"3"/* unless ibase is ten.   */if(r== v++)"4"if(r== v++)"5"if(r== v++)"6"if(r== v++)"7"if(r== v++)"8"if(r== v++)"9"if(r== v++)"A"if(r== v++)"B"if(r== v++)"C"if(r== v++)"D"if(r== v++)"E"if(r== v++)"F"}scale= s/* Restore original scale. */}

Then use this function to print 7.125 with 9 characters.

x=7.125"Decimal: "; t= p(x,9);""ibase=16"Hexadecimal: "; t= p(x,9);""ibase=2"Binary: "; t= p(x,1001);""quit
Output:
Decimal: 00007.125Hexadecimal: 0000007.2Binary: 00111.001

Beads

beads 1 program 'Formatted numeric output'calc main_initvar num = 7.125log to_str(num, min:9, zero_pad:Y)
Output:
00007.125

C

#include<stdio.h>main(){floatr=7.125;printf(" %9.3f\n",-r);printf(" %9.3f\n",r);printf(" %-9.3f\n",r);printf(" %09.3f\n",-r);printf(" %09.3f\n",r);printf(" %-09.3f\n",r);return0;}
Output:
   -7.125    7.1257.125    -0007.12500007.1257.125

C#

classProgram{staticvoidMain(string[]args){floatmyNumbers=7.125F;stringstrnumber=Convert.ToString(myNumbers);Console.WriteLine(strnumber.PadLeft(9,'0'));Console.ReadLine();}}

C++

#include<iostream>#include<iomanip>intmain(){std::cout<<std::setfill('0')<<std::setw(9)<<std::fixed<<std::setprecision(3)<<7.125<<std::endl;return0;}

C++20

#include<iostream>#include<format>intmain(){std::cout<<std::format("{:09.3f}\n",7.125);return0;}

Clojure

Translation of:Common Lisp

Using cl format strings

(cl-formattrue"~9,3,,,'0F"7.125)
Translation of:java

Using java format strings

(printf"%09.3f"7.125); format works the same way (without side the effect of printing)

COBOL

This is actually the easiest kind of numeric output to achieve in COBOL, because it requires no adjustments from the way numbers are stored internally (in fixed-point decimal). Each variable declaration requires aPIC orPICTURE clause describing the kind of data that will be stored there. In this case, we have9 (a decimal digit), repeated five times; thenV, the decimal point (cf. Frenchvirgule); and then three more decimal digits. Other terms that can appear inPICTURE clauses includeA (a letter of the alphabet),X (a character), andZ (a decimal digit to be printed with leading spaces instead of leading zeros).

IDENTIFICATIONDIVISION.PROGRAM-ID.NUMERIC-OUTPUT-PROGRAM.DATA DIVISION.WORKING-STORAGESECTION.01  WS-EXAMPLE.    05XPIC  9(5)V9(3).PROCEDUREDIVISION.    MOVE7.125TOX.    DISPLAYXUPONCONSOLE.    STOPRUN.
Output:
00007.125

Common Lisp

(formatt"~9,3,,,'0F"7.125)

D

importstd.stdio;voidmain(){immutabler=7.125;writefln(" %9.3f",-r);writefln(" %9.3f",r);writefln(" %-9.3f",r);writefln(" %09.3f",-r);writefln(" %09.3f",r);writefln(" %-09.3f",r);}
Output:
    -7.125     7.125 7.125     -0007.125 00007.125 7.125

DBL

D5=7125                                                                                                                                                      A10=D5,'-ZZZZX.XXX'          ;     7.125                                                                                                                     A10=D5,'-ZZZZX.XXX'  [LEFT]  ;7.125                                                                                                                          A10=D5,'-XXXXX.XXX'          ; 00007.125                                                                                                                     A10=-D5,'-ZZZZX.XXX'         ;-    7.125                                                                                                                     A10=-D5,'-ZZZZX.XXX' [LEFT]  ;-    7.125                                                                                                                     A10=-D5,'-XXXXX.XXX' [LEFT]  ;-00007.125                                                                                                                     A10=-D5,'XXXXX.XXX-'         ;00007.125-                                                                                                                     A10=-D5,'ZZZZX.XXX-'         ;    7.125-                                                                                                                     A10=-D5,'ZZZZX.XXX-' [LEFT]  ;7.125-  A10=1500055,'ZZZ,ZZX.XX      ; 15,000.55

dc

Translation of:bc

First define a custom function for numeric output.

[* * (n) (c) lpx * Print number n, using at least c characters. * * Different from normal, this function: *  1. Uses the current ibase (not the obase) to print the number. *  2. Prunes "0" digits from the right, so [1.500 1 lxp] prints "1.5". *  3. Pads "0" digits to the left, so [_1.5 6 lxp] prints "-001.5". *  4. Never prints a newline. *]sz[ Sc Sn          [Local n, c = from stack.]sz K Ss           [Local s = original scale.]sz [Reserve local variables D, F, I, L.]sz 0 SD 0 SF 0 SI 0 SL [              [If n < 0:]sz  [-]P           [Print negative sign.]sz  lc 1 - sc      [Decrement c.]sz  0 ln - sn      [Negate n.]sz ]sI 0 ln <I [*   * Array D[] takes digits before the radix point.  *]sz 0 k            [scale = 0]sz 0 Sd           [Local d = 0]sz ln 1 /         [Push digits before radix point.]sz [              [Loop to fill D[]:]sz  d 10 % ld :D   [D[d] = next digit.]sz  ld 1 + sd      [Increment d.]sz  10 /           [Remove digit.]sz  d 0 !=L        [Loop until no digits.]sz ]sL d 0 !=L sz             [Pop digits.]sz [*  * Array F[] takes digits after the radix point.  *]sz ln ln 1 / -    [Push digits after radix point.]sz d X k          [scale = enough.]sz _1 Sf          [Local f = -1]sz d 1 +          [Push 1 + digits after radix point.]sz [              [Loop to count digits:]sz  lf 1 + sf      [Increment f.]sz  10 /           [Remove digit.]sz  d 0 !=L        [Loop until no digits.]sz ]sL d 0 !=L sz             [Pop 1 + digits.]sz 0 k            [scale = 0]sz 10 lf ^ * 1 /  [Remove radix point from digits.]sz [              [Loop to prune digits:]sz  lf 1 - sf      [Decrement f.]sz  10 /           [Remove digit.]sz  d 10 % 0 =L    [Loop while last digit is 0.]sz ]sL d 10 % 0 =L 0 Si           [Local i = 0]sz [              [Loop to fill F[]:]sz  d 10 % li :F   [F[i] = next digit.]sz  10 /           [Remove digit.]sz  li 1 + si      [Increment i.]sz  lf li <L       [Loop while i < f.]sz ]sL lf li <L sz             [Pop digits.]sz lc ld -        [Push count = c - d.]sz [              [If f > 0:]sz  1 lf + -       [Subtract 1 radix point + f from count.]sz ]sI 0 lf >I [              [Loop:]sz  [0]P           [Print a padding "0".]sz  1 -            [Decrement count.]sz  d 0 <L         [Loop while count > 0.]sz ]sL d 0 <L sz             [Pop count.]sz [              [Local function (digit) lPx:]sz  [              [Execute:]sz   [*    * Push the string that matches the digit.    *]sz   [[0] 2Q]sI d 0 =I  [[1] 2Q]sI d 1 =I  [[2] 2Q]sI d 2 =I  [[3] 2Q]sI d 3 =I   [[4] 2Q]sI d 4 =I  [[5] 2Q]sI d 5 =I  [[6] 2Q]sI d 6 =I  [[7] 2Q]sI d 7 =I   [[8] 2Q]sI d 8 =I  [[9] 2Q]sI d 9 =I  [[A] 2Q]sI d A =I  [[B] 2Q]sI d B =I   [[C] 2Q]sI d C =I  [[D] 2Q]sI d D =I  [[E] 2Q]sI d E =I  [[F] 2Q]sI d F =I   [?]            [Else push "?".]sz  ]x  P              [Print the string.]sz  sz             [Pop the digit.]sz ]SP ld             [Push counter = d.]sz [              [Loop:]sz  1 -            [Decrement counter.]sz  d ;D lPx       [Print digit D[counter].]sz  d 0 <L         [Loop while counter > 0.]sz ]sL d 0 <L sz             [Pop counter.]sz [              [If f > 0:]sz  [.]P           [Print radix point.]sz  lf              [Push counter = f.]sz  [              [Loop:]sz   1 -            [Decrement counter.]sz   d ;F lPx       [Print digit F[counter].]sz   d 0 <L         [Loop while counter > 0.]sz  ]sL d 0 <L  sz             [Pop counter.]sz ]sI 0 lf >I [Restore variables n, c, d, f, D, F, L, I, P.]sz Lnsz Lcsz Ldsz Lfsz LDsz LFsz LLsz LIsz LPsz Ls k           [Restore variable s. Restore original scale.]sz]sp

Then use this function to print 7.125 with 9 characters:

7.125 sx[Decimal: ]P lx 9 lpx []P 16 i [Hexadecimal: ]P lx 9 lpx []P 2 i [Binary: ]P lx 9 lpx []P
Output:
Decimal: 00007.125Hexadecimal: 0000007.2Binary: 00111.001

Delphi

programFormattedNumericOutput;{$APPTYPE CONSOLE}usesSysUtils;constfVal=7.125;beginWriteln(FormatFloat('0000#.000',fVal));Writeln(FormatFloat('0000#.0000000',fVal));Writeln(FormatFloat('##.0000000',fVal));Writeln(FormatFloat('0',fVal));Writeln(FormatFloat('#.#E-0',fVal));Writeln(FormatFloat('#,##0.00;;Zero',fVal));Readln;end.
Output:
00007.12500007.12500007.125000077.1E07.13

DuckDB

Works with:DuckDB version V1.1
Works with:DuckDB version V1.0

DuckDB supports string formatting using the widespread printf() conventions andalso thefmt mini-language :

SELECTprintf('%09.3f',7.125),format('{:09.3f}',7.125);
Output:
┌─────────────────────────┬───────────────────────────┐│ printf('%09.3f', 7.125) │ format('{:09.3f}', 7.125) ││         varchar         │          varchar          │├─────────────────────────┼───────────────────────────┤│ 00007.125               │ 00007.125                 │└─────────────────────────┴───────────────────────────┘

Here's a typescript showing how to avoid the tabular decorations:

D .headers offD .mode listD SELECT printf('%09.3f', 7.125);00007.125D SELECT format('{:09.3f}', 7.125);00007.125

Eiffel

Works with:Eiffel Studio version 6.6
notedescription:"{2Examplesaregiven.Thefirstexampleusesthestandardlibrary'sFORMAT_DOUBLEclass.ThesecondexampleusestheAEL_PRINTFclassfromthefreelyavailableAmalasoftEiffelLibrary(AEL).Seeadditionalcommentsinthecode.}"classAPPLICATIONinheritAEL_PRINTF-- Optional, see belowcreatemakefeature{NONE}-- Initializationmake-- Run application.doprint_formatted_std(7.125)print_formatted_ael(7.125)end--|--------------------------------------------------------------print_formatted_std(v:REAL_64)-- Print the value 'v' as a zero-padded string in a fixed-- overall width of 9 places and, with a precision of-- to 3 places to the right of the decimal point.-- Use the FORMAT_DOUBLE class from the standard librarylocalfmt:FORMAT_DOUBLEdocreatefmt.make(9,3)fmt.zero_fillprint(fmt.formatted(v)+"%N")end--|--------------------------------------------------------------print_formatted_ael(v:REAL_64)-- Print the value 'v' as a zero-padded string in a fixed-- overall width of 9 places and, with a precision of-- to 3 places to the right of the decimal point.-- Use the AEL_PRINTF class from the Amalasoft Eiffel Library-- freely available from www.amalasoft.comdo-- printf accepts a format string and an argument list-- The argument list is a container (often a manifest-- array) of values corresponding to the type of the format-- specified in the format string argument.-- When only one argument is needed, then there is also the-- option to use just the value, without the container.-- In this example, the line would be:--   printf ("%%09.3f%N", v)-- The more deliberate form is used in the actual example,-- as it is more representative of common usage, when there-- are multiple value arguments.printf("%%09.3f%N",<<v>>)endend

Elixir

n=7.125:io.fwrite"~f~n",[n]:io.fwrite"~.3f~n",[n]:io.fwrite"~9f~n",[n]:io.fwrite"~9.3f~n",[n]:io.fwrite"~9..0f~n",[n]:io.fwrite"~9.3.0f~n",[n]:io.fwrite"~9.3._f~n",[n]:io.fwrite"~f~n",[-n]:io.fwrite"~9.3f~n",[-n]:io.fwrite"~9.3.0f~n",[-n]:io.fwrite"~e~n",[n]:io.fwrite"~12.4e~n",[n]:io.fwrite"~12.4.0e~n",[n]
Output:
7.1250007.125 7.125000    7.12507.12500000007.125____7.125-7.125000   -7.125000-7.1257.12500e+0    7.125e+000007.125e+0

Emacs Lisp

(format"%09.3f"7.125);=> "00007.125"

format is similar to Csprintf. SeeGNU Elisp manual on Formatting Strings.

Erlang

Built in

Output:
14> io:fwrite("~9.3.0f~n", [7.125]).00007.125

ERRE

PROGRAM FORMATTEDPROCEDURE FORMATTED_PRINT(N,LENGTH,DEC_PLACES->FP$)    LOCAL I,C$,NN$    FORMAT$=STRING$(LENGTH,"#")+"."    FOR I=1 TO DEC_PLACES DO       FORMAT$=FORMAT$+"#"    END FOR    OPEN("O",1,"FORMAT.$$$")       WRITE(#1,FORMAT$;N)    CLOSE(1)    OPEN("I",1,"FORMAT.$$$")       INPUT(LINE,#1,N$)    CLOSE(1)    ! add leading zeros    FOR I=1 TO LEN(N$) DO       C$=MID$(N$,I,1)       IF C$=" " OR C$="%" THEN NN$=NN$+"0" ELSE NN$=NN$+C$    END FOR    FP$=RIGHT$("000000000000"+NN$,LENGTH) ! chop to required lengthEND PROCEDUREBEGIN   PRINT(CHR$(12);) ! CLS   FOR I=1 TO 10 DO     N=RND(1)*10^(INT(10*RND(1))-2)     FORMATTED_PRINT(N,16,5->FP$)     PRINT("Raw number =";N;TAB(30);"Using custom function =";FP$)   END FOREND PROGRAM
Output:
Raw number = 1213.501        Using custom function =0000001213.50100Raw number = 86886.11        Using custom function =0000086886.11000Raw number = 7.98853E-03     Using custom function =0000000000.00799Raw number = 49.03128        Using custom function =0000000049.03128Raw number = 1072496         Using custom function =0001072496.00000Raw number = 703.8703        Using custom function =0000000703.87030Raw number = 9.711614        Using custom function =0000000009.71161Raw number = 9561278         Using custom function =0009561278.00000Raw number = 534.9367        Using custom function =0000000534.93670Raw number = 67121.88        Using custom function =0000067121.88000

Euphoria

constant r = 7.125printf(1,"%9.3f\n",-r)printf(1,"%9.3f\n",r)printf(1,"%-9.3f\n",r)printf(1,"%09.3f\n",-r)printf(1,"%09.3f\n",r)printf(1,"%-09.3f\n",r)
Output:
    -7.125     7.125 7.125 -0007.125 00007.125 7.125

F#

printfn"%09.3f"7.125f

Factor

USE:formatting7.125"%09.3f\n"printf
Output:
00007.125

Fantom

class Main{  public static Void main()  {    echo (7.125.toStr.padl(9, '0'))  }}

Forth

Forth has a rather rich set of number formatting words, which makes formatted output very flexible but sometime cumbersome.

Here one way to generate the required output. Note that the number generated is NOT truncated to the field width. If you wish to truncate the number, remove #s and 1- from the definition. (The 1- is necessary because #s always generates at least one digit, even if it's zero.)

\ format 'n' digits of the double word 'd':#n( d n -- d )0?do#loop;\ ud.0 prints an unsigned double:ud.0( d n -- )<#1-#n#s#>type;\ d.0 prints a signed double:d.0( d n -- )>rtuckdabs<#r>1-#n#srotsign#>type;

Usage example:

Type:123s>d8ud.0Result:00000123okType:-123s>d8d.0Result:-00000123ok

Detail

Forth's number formatting words are different than many other languages because they are active code rather than using a pattern string. This small set of seven routines ( >DIGIT <# #> # #S HOLD SIGN ) allow arbitrary number formatting of double precision and single precision numbers. The number is created in a "hold' buffer the output is typically a Forth style stack-string consisting of an address and a length.

Typical of Forth the using the formatting routines means putting things in reverse order.We are also free to create a mnemonic name that gives a reminder at how numbers will appear.

To replicate the example for this task we could write:

: '.'   [CHAR] . HOLD ; \ HOLD inserts a character into the number string\                                    right side .  left side : 0000#.###  ( d -- addr len) DABS <#    # # # '.' # # # # #    #> ;

At the console we can input a double number, execute the format routine and type the resulting string.

7.125 0000#.### TYPE 000007.125 ok

Fortran

Works with:Fortran version 90 and later

Using standard data edit descriptors it is only possible to precede Integer data with leading zeros.

INTEGER::number=7125WRITE(*,"(I8.8)")number! Prints 00007125

On the other hand

One can engage in trickery via FORMAT statements, in particular the T format option. Unlike actual tab settings which on a typewriter go to a particular column following, Tn means go to columnn.

INTEGERIVREALVDATAV/7.125/!A positive number.IV=V!Grab the integer part.WRITE(6,1)V,IV1FORMAT(F9.3,T1,I5.5)END

Output is

00007.125

This would need adjustment for other sizes, but works as follows: The value part is printed (in the format system's working area) as "bbbb7.125" (b's standing for spaces), then the T1 moves the finger back to column one, and the I5.5 writes out "00007", the .5 addendum to I5 meaning print leading zeroes rather than leading spaces. It does not overwrite the subsequent ".125", and as no further output items appear the deed is done. Only later Fortran offers the addendum feature, but the Tab feature is much older.

Another approach would be to write forth a literal "0000" instead of the integer, but this is less flexible. In the absence of the .5 addendum, write the output to a character string (or equivalent), replace leading spaces by zeroes (watching out for negative numbers), and print the result.

Free Pascal

SeePascal

Fōrmulæ

Fōrmulæ programs are not textual, visualization/edition of programs is done showing/manipulating structures but not text. Moreover, there can be multiple visual representations of the same program. Even though it is possible to have textual representation —i.e. XML, JSON— they are intended for storage and transfer purposes more than visualization and edition.

Programs in Fōrmulæ are created/edited online in itswebsite.

Inthis page you can see and run the program(s) related to this task and their results. You can also change either the programs or the parameters they are called with, for experimentation, but remember that these programs were created with the main purpose of showing a clear solution of the task, and they generally lack any kind of validation.

FutureBasic

window 1, @"Formatted Numeric Output", (0,0,480,270)// option 1print using "0000#.###";7.125// option 2printf @"%09.3f",7.125

Gambas

Click this link to run this code

PublicSubMain()PrintFormat("7.125","00000.000")End

Output:

00007.125

gnuplot

printsprintf("%09.3f",7.125)

Go

fmt.Printf("%09.3f",7.125)

Groovy

Solution:

printf("%09.3f",7.125)
Output:
00007.125

Haskell

importText.Printfmain=printf"%09.3f"7.125

hexiscript

fun format n length  let n tostr n  while len n < length    let n 0 + n  endwhile  println nendfunformat 7.125 9

HicEst

WRITE(ClipBoard, Format='i5.5, F4.3') INT(7.125), MOD(7.125, 1)    ! 00007.125

i

concept FixedLengthFormat(value, length) {string = text(abs(value))prefix = ""sign = ""if value < 0sign = "-"endif #string < lengthprefix = "0"*(length-#sign-#string-#prefix)endreturn sign+prefix+string}software {d = 7.125print(FixedLengthFormat(d, 9))print(FixedLengthFormat(-d, 9))}

Icon andUnicon

linkprintfproceduremain()everyr:=&pi|-r|100-rdo{write(r," <=== no printf")everyp:="|%r|"|"|%9.3r|"|"|%-9.3r|"|"|%0.3r|"|"|%e|"|"|%d|"dowrite(sprintf(p,r)," <=== sprintf ",p)}end
Output:

Abbreviated

3.141592653589793 <=== no printf|3.141593| <=== sprintf |%r||    3.142| <=== sprintf |%9.3r||3.142    | <=== sprintf |%-9.3r||3.142| <=== sprintf |%0.3r||   3.141593e0| <=== sprintf |%e||3| <=== sprintf |%d|
Library:Icon Programming Library

providesprintf

IDL

n=7.125print,n,format='(f08.3)';==> 0007.125

J

'r<0>9.3'(8!:2)7.12500007.125

Documentation on 8!:

Java

Works with:Java version 1.5+

Stealing printf from C/C++:

publicclassPrinting{publicstaticvoidmain(String[]args){doublevalue=7.125;System.out.printf("%09.3f",value);// System.out.format works the same waySystem.out.println(String.format("%09.3f",value));}}
Output:
000000007.125000000007.125

UsingNumberFormat:

importjava.text.DecimalFormat;importjava.text.NumberFormat;publicclassFormat{publicstaticvoidmain(String[]args){NumberFormatnumForm=newDecimalFormat();numForm.setMinimumIntegerDigits(9);//Maximum also available for Integer digits and Fraction digitsnumForm.setGroupingUsed(false);//stops it from inserting commasSystem.out.println(numForm.format(7.125));//example of Fraction digit optionsnumForm.setMinimumIntegerDigits(5);numForm.setMinimumFractionDigits(5);System.out.println(numForm.format(7.125));numForm.setMinimumFractionDigits(0);numForm.setMaximumFractionDigits(2);System.out.println(numForm.format(7.125));System.out.println(numForm.format(7.135));//rounds to even}}
Output:
000000007.12500007.1250000007.1200007.14

JavaScript

functionfmt(n,options){const[whole,fraction]=String(n).split('.',2)return[whole.padStart(options.whole||1,'0'),(fraction??'').padEnd(options.fraction,'0').slice(0,options.fraction),].filter(Boolean).join('.')}for(const[n,options]of[[123,{whole:1,fraction:2}],// 123.00[123,{whole:5,fraction:2}],// 00123.00[123,{whole:5,fraction:0}],// 00123[0.5,{whole:1,fraction:2}],// 0.50[0.5,{whole:5,fraction:2}],// 00000.50[0.5,{whole:5,fraction:0}],// 00000]){console.log(fmt(n,options))}

Also, a 60-line implementation ofsprintf can be foundhere.

jq

The jq function pp0/1 as defined below is written in accordance with the taskrequirements, but no truncation occurs; pp/1 is similar butis likely to be more useful as the decimal point is aligned if possible.

def pp0(width):  tostring  | if width > length then (width - length) * "0" + . else . end;# pp(left; right) formats a decimal number to occupy# (left+right+1) positions if possible,# where "left" is the number of characters to the left of# the decimal point, and similarly for "right".def pp(left; right):  def lpad: if (left > length) then ((left - length) * "0") + . else . end;  tostring as $s  | $s  | index(".") as $ix  | ((if $ix then $s[0:$ix] else $s end) | lpad) + "." +    (if $ix then $s[$ix+1:] | .[0:right] else "" end);

Examples:

(1.0, 12.3, 333.333, 1e6) | pp0(10)

produces

000000000100000012.3000333.3330001000000
(1.0, 12.3, 333.333, 1e6) | pp(4;2)

produces

0001.0012.30333.331000000.

Julia

Julia's@sprintf macro provides string formatting that is similar to that of the c function of the same name. Though easy to use and efficient,@sprintf has limited flexibility, as its format specification must be a string literal, precluding its use in dynamic formatting. Greater flexibility is available via theFormatting package, which provides an implementation of Python's format specification mini-language. This solution demonstrates both of these techniques to provide the leading zero padded floating point format suggested in the task description ("%09.3f").

usingPrintftest=[7.125,[rand()*10^rand(0:4)foriin1:9]]println("Formatting some numbers with the @sprintf macro (using\"%09.3f\"):")foriintestprintln(@sprintf"%09.3f"i)endusingFormattingprintln()println("The same thing using the Formatting package:")fe=FormatExpr("    {1:09.3f}")foriintestprintfmtln(fe,i)end
Output:
Formatting some numbers with the @sprintf macro (using "%09.3f"):    00007.125    00001.734    00903.432    00000.980    00002.271    00559.864    00105.497    00069.955    00046.107    04970.430The same thing using the Formatting package:    00007.125    00001.734    00903.432    00000.980    00002.271    00559.864    00105.497    00069.955    00046.107    04970.430

Kotlin

// version 1.0.5-2funmain(args:Array<String>){valnum=7.125println("%09.3f".format(num))}
Output:
00007.125

Lambdatalk

Lambdatalk has no primitive for numeric output. This is a way to define it:

{deffmt{defpadd{lambda{:n:x}{if{<:n1}thenelse:x{padd{-:n1}:x}}}}{deftrunc{lambda{:n}{if{>:n0}then{floor:n}else{ceil:n}}}}{lambda{:a:b:n}{let{{:a:a}{:b:b}{:n{abs:n}}{:sign{if{>=:n0}then+else-}}{:int{trunc:n}}{:dec{ceil{*1.0e:b{abs{-:n{trunc:n}}}}}}}{br}{padd{-:a{W.length{trunc:n}}}>}{if{W.equal?:sign-}thenelse:sign}:int.:dec{padd{-:b{W.length:dec}}0}}}}->fmt{defnumbers7.12510.70.980-1000559.8-69.994970.430}->numbers{S.map{fmt103}{numbers}}->>>>>>>>>>+7.125>>>>>>>>+10.699>>>>>>>>>+0.980>>>>>>-1000.000>>>>>>>+559.799>>>>>>>>-69.990>>>>>>+4970.430

Lasso

7.125->asstring(-precision=3,-padding=9,-padchar='0')
Output:
00007.125

Logo

Various collection functions, such as MAP and FILTER, will work on individual characters of a string when given a word instead of a list.

to zpad :num :width :precision  output map [ifelse ? = "| | ["0] [?]] form :num :width :precisionendprint zpad 7.125 9 3  ; 00007.125

Berkeley Logo

Works with:UCB Logo

As a debugging feature, you can drop down toC language printf formatting by giving -1 for the width and a format string for the precision.

print form 7.125 -1 "|%09.3f|    ; 00007.125

Lua

functiondigits(n)returnmath.floor(math.log(n)/math.log(10))+1endfunctionfixedprint(num,digs)--digs = number of digits before decimal pointfori=1,digs-digits(num)doio.write"0"endprint(num)endfixedprint(7.125,5)--> 00007.125


An easier way to do that would be

print(string.format("%09.3d",7.125))

M2000 Interpreter

Locale1032Printstr$(7.125,"00000.000")="00007,125"' Αληθές//multiplecolumnprintPrint$("00000.000"),7.125,100,200.567Print$("")Locale1033Printstr$(7.125,"00000.000")="00007.125"' True//multiplecolumnprintPrint$("00000.000"),7.125,100,200.567Print$("")

Maple

printf("%f",Pi);3.141593printf("%.0f",Pi);3printf("%.2f",Pi);3.14printf("%08.2f",Pi);00003.14printf("%8.2f",Pi);3.14printf("%-8.2f|",Pi);3.14|printf("%+08.2f",Pi);+0003.14printf("%+0*.*f",8,2,Pi);+0003.14

Mathematica /Wolfram Language

StringTake["000000"<>ToString[7.125],-9]00007.125

MATLAB /Octave

>>disp(sprintf('%09.3f',7.125))00007.125

Maxima

Translation of:Common Lisp
printf(false,"~9,3,,,'0F",7.125);
Output:
"00007.125"

Mercury

:- module formatted_numeric_output.:- interface.:- import_module io.:- pred main(io::di, io::uo) is det.:- implementation.:- import_module list, string.main(!IO) :-    io.format("%09.3f\n", [f(7.125)], !IO).

min

Works with:min version 0.37.0
(pick length - repeat prefix) ^left-pad7.125 string "0" 9 left-pad puts!
Output:
00007.125

Modula-3

ModulesIO andFmt must be imported before use.

IO.Put(Fmt.Pad("7.125\n",length:=10,padChar:='0'));

Nanoquery

printer = 7.125println format("%09.3f", printer)
Output:
00007.125

NetRexx

/* NetRexx */optionsreplaceformatcommentsjavacrossrefsavelogsymbolsbinaryimportjava.text.MessageFormatsevenPointOneTwoFive=double7.125--usingNetRexxBuilt-InFunctions(BIFs)sayRexx(sevenPointOneTwoFive).format(5,3).changestr(' ','0')--usingJavalibraryconstructsSystem.out.printf('%09.3f\n',[Double(sevenPointOneTwoFive)])sayMessageFormat.format('{0,number,#00000.###}',[Double(sevenPointOneTwoFive)])return
Output:
00007.12500007.12500007.125

Nim

importstrformatconstr=7.125echorechofmt"{-r:9.3f}"echofmt"{r:9.3f}"echofmt"{-r:09.3f}"echofmt"{r:09.3f}"
Output:
7.125   -7.125    7.125-0007.12500007.125

Oberon-2

ModuleOut must be imported before use.

Out.Real(7.125,9,0);

Objective-C

NSLog(@"%09.3f",7.125);

or

NSLog(@"%@",[NSStringstringWithFormat:@"%09.3f",7.125]);

OCaml

Printf.printf"%09.3f\n"7.125

OpenEdge/Progress

MESSAGE   STRING( 7.125, "99999.999" )VIEW-AS ALERT-BOX.

Oz

It is possible to set the precision used for float printing (where "precision" means the total number of digits used).

It doesn't seem to be possible to use leading zeros for printing, so we implement this manually:

declare  fun {PrintFloat X Prec}     {Property.put 'print.floatPrecision' Prec}     S = {Float.toString X}  in     {Append      for I in 1..Prec-{Length S}+1 collect:C do {C &0} end      S}  endin   {System.showInfo {PrintFloat 7.125 8}}

PARI/GP

Works with:PARI/GP version 2.4.3 and above
printf("%09.4f\n", Pi)

Pascal

procedurewriteInFixedFormat(n:real);constwholeNumberPlaces=5;fractionalPlaces=3;zeroDigit='0';negative='-';varsignPresent:boolean;i:integer;begin// NOTE: This does not catch “negative” zero.signPresent:=n<0.0;ifsignPresentthenbeginwrite(negative);n:=abs(n);end;// determine number of leading zerosi:=wholeNumberPlaces;ifn>0thenbegini:=i-trunc(ln(n)/ln(10));end;fori:=i-1downtosucc(ord(signPresent))dobeginwrite(zeroDigit);end;// writes n with// - at least 0 characters in total// - exactly fractionalPlaces post-radix digits// roundedwrite(n:0:fractionalPlaces);end;

PascalABC.NET

##varPi:=3.1415926536;Println($'{Pi,8:f2}');Println($'{Pi,-8:f3}!');
Output:
    3.143.142   !

Perl

Works with:Perl version 5.x
printf"%09.3f\n",7.125;

Phix

Library:Phix/basics
printf(1,"%09.3f\n",7.125)
Output:
 00007.125

PHP

echostr_pad(7.125,9,'0',STR_PAD_LEFT);

or

printf("%09.3f\n",7.125);

PicoLisp

(pad 9 (format 7125 3))(pad 9 (format 7125 3 ","))  # European format

PL/I

put edit (X) (p'999999.V999'); /* Western format. */put edit (X) (p'999999,V999'); /* In European format. */
 lz: Proc Options(main); /********************************************************************* * 10.09.2013 Walter Pachl  one way to treat negative numbers * another would be using a Picture of 'S(9)9.V(3)9' or '-(9)9.V(3)9' *********************************************************************/ Call z2lz(1.2); Call z2lz(-1.32);    Call z2lz(123456789.012); Call z2lz(-23456789.012); Call z2lz(-123456789.012); z2lz: Proc(z); Dcl z Dec Fixed(15,3); ; Dcl s Char(13) Based(addr(p)); Dcl p  Pic'(9)9.V(3)9'; p=z; If z<0 Then   If left(s,1)='0' Then substr(s,1,1)='-';   Else Do;     Put Skip List(z,'can''t be formatted that way');     Return;     End; Put Skip List(z,s); End; End;
Output:
             1.200      000000001.200            -1.320      -00000001.320         123456789.012      123456789.012     -23456789.012      -23456789.012    -123456789.012      can't be formatted that way

Pluto

print(string.format("%09.3f",7.125))
Output:
00007.125

Pop11

The task is underspecified, so we present a few alternatives.

;;; field of length 12, 3 digits after decimal placeformat_print('~12,3,0,`*,`0F', [1299.19]);;;; prints "00001299.190"format_print('~12,3,0,`*,`0F', [100000000000000000]);;;; Since the number does not fit into the field prints "************";;; that is stars instead of the numberformat_print('~12,3,0,`*,`0F', [-1299.19]);;;; prints "000-1299.190";;; that is _leading zeros_ before signformat_print('~3,1,12,`0:$', [1299.19]);;;; prints "00001299.190"format_print('~3,1,12,`0:$', [-1299.19]);;;; prints "-0001299.190";;; that is sign before leading zerosformat_print('~3,1,12,`0:$', [100000000000000000]);;;; prints "100000000000000000.000";;; that is uses more space if the number does not fit into;;; fixed width

PowerShell

Using the-f formatting operator and a custom format string:

'{0:00000.000}'-f7.125

or by invokingToString on the number:

7.125.ToString('00000.000')

Python

Works with:Python version 2.5

Python has 3 different floating point formatting methods: "%e","%f" & "%g". The "%g" format is a beautified hybrid of "%e" and "%f". There is no way of specifying how many digits appear in the exponent when printed with a format.

frommathimportpi,expr=exp(pi)-piprintrprint"e=%e f=%f g=%g G=%G s=%s r=%r!"%(r,r,r,r,r,r)print"e=%9.4e f=%9.4f g=%9.4g!"%(-r,-r,-r)print"e=%9.4e f=%9.4f g=%9.4g!"%(r,r,r)print"e=%-9.4e f=%-9.4f g=%-9.4g!"%(r,r,r)print"e=%09.4e f=%09.4f g=%09.4g!"%(-r,-r,-r)print"e=%09.4e f=%09.4f g=%09.4g!"%(r,r,r)print"e=%-09.4e f=%-09.4f g=%-09.4g!"%(r,r,r)
Output:
19.9990999792e=1.999910e+01 f=19.999100 g=19.9991 G=19.9991 s=19.9990999792 r=19.999099979189474!e=-1.9999e+01 f= -19.9991 g=      -20!e=1.9999e+01 f=  19.9991 g=       20!e=1.9999e+01 f=19.9991   g=20       !e=-1.9999e+01 f=-019.9991 g=-00000020!e=1.9999e+01 f=0019.9991 g=000000020!e=1.9999e+01 f=19.9991   g=20       !
Works with:Python version 3
frommathimportpi,expr=exp(pi)-piprint(r)print("e={0:e} f={0:f} g={0:g} G={0:G} s={0!s} r={0!r}!".format(r))print("e={0:9.4e} f={0:9.4f} g={0:9.4g}!".format(-r))print("e={0:9.4e} f={0:9.4f} g={0:9.4g}!".format(r))print("e={0:-9.4e} f={0:-9.4f} g={0:-9.4g}!".format(r))print("e={0:09.4e} f={0:09.4f} g={0:09.4g}!".format(-r))print("e={0:09.4e} f={0:09.4f} g={0:09.4g}!".format(r))print("e={0:-09.4e} f={0:-09.4f} g={0:-09.4g}!".format(r))
Output:
19.9990999792e=1.999910e+01 f=19.999100 g=19.9991 G=19.9991 s=19.9990999792 r=19.999099979189474!e=-1.9999e+01 f= -19.9991 g=      -20!e=1.9999e+01 f=  19.9991 g=       20!e=1.9999e+01 f=19.9991   g=20       !e=-1.9999e+01 f=-019.9991 g=-00000020!e=1.9999e+01 f=0019.9991 g=000000020!e=1.9999e+01 f=19.9991   g=20       !

Quackery

Behaviour offormat ( $ a b --> $ )

Accepts a well formatted numerical string$, optionally with a decimal point, without validation.

a is the number of digits before the decimal point.b is the number of digits after the decimal point.

Returns a string$ with either a leading zero or a leading space, thenat leasta digits, then a decimal point, thenat leastb digits. The digits are padded with zeroes fore and aft if required.

"at least" – if there are already more digits before the point thana, and/or more digits after the point thanb, it willnot crop the number. IMO, it is better to mess up the formatting than to display an incorrect number. Check the $ is not too long fore or aft before passing toformat if the string may be truncated.

  [ over find swap found ]     is has       (   $ c --> b )  [ over 0 peek    char - = iff      [ dip [ behead drop ]        true unrot ]    else [ false unrot ]    over char . swap find    -  char 0 swap of    swap join    swap iff char -    else space    swap join ]                is left-pad  (   $ n --> $ )   [ over char . has not if       [ dip [ char . join ] ]     over char . swap find     dip [ over size ]     1+ - -     char 0 swap of     join ]                    is right-pad (   $ n --> $ )  [ dip left-pad right-pad ]   is format    ( $ n n --> $ )  ' [ $ "7.125"      $ "-7.125"      $ "0.125"      $ "-0.12"      $ "7.12"      $ "-7.12"      $ "0.12"      $ "-0.12"      $ "7"      $ "-7"      $ "0" ]  witheach    [ do 5 3 format echo$ cr ]
Output:
 00007.125-00007.125 00000.125-00000.120 00007.120-00007.120 00000.120-00000.120 00007.000-00007.000 00000.000

R

sprintf brings the printf goodness one expects:

>sprintf("%f",pi)[1]"3.141593">sprintf("%.3f",pi)[1]"3.142">sprintf("%1.0f",pi)[1]"3">sprintf("%5.1f",pi)[1]"  3.1">sprintf("%05.1f",pi)[1]"003.1">sprintf("%+f",pi)[1]"+3.141593">sprintf("% f",pi)[1]" 3.141593">sprintf("%-10f",pi)# left justified[1]"3.141593  ">sprintf("%e",pi)[1]"3.141593e+00">sprintf("%E",pi)[1]"3.141593E+00">sprintf("%g",pi)[1]"3.14159">sprintf("%g",1e6*pi)# -> exponential[1]"3.14159e+06">sprintf("%.9g",1e6*pi)# -> "fixed"[1]"3141592.65">sprintf("%G",1e-6*pi)[1]"3.14159E-06"

formatC also provides C-style string formatting.

formatC(x,width=9,flag="0")# "00007.125"

Other string formatting functions include

format, prettynum

Racket

->(displayln(~a7.125#:width9#:align'right#:pad-string"0"))00007.125

Raku

(formerly Perl 6)

say7.125.fmt('%09.3f');

Raven

7.125 "%09.3f" print00007.125
Translation of:Python
define PI   -1 acos   PI exp PI - as r r print "\n" printr "" prefer "s=%s!\n" printr dup dup dup dup "e=%e f=%f g=%g G=%G!\n" print-1 r * dup dup "e=%9.4e f=%9.4f g=%9.4g!\n"  printr dup dup "e=%9.4e f=%9.4f g=%9.4g!\n" printr dup dup "e=%-9.4e f=%-9.4f g=%-9.4g!\n" printr -1 * dup dup "e=%09.4e f=%09.4f g=%09.4g!\n" printr dup dup "e=%09.4e f=%09.4f g=%09.4g!\n" printr dup dup "e=%-09.4e f=%-09.4f g=%-09.4g!\n" print
19.9991s=19.999100!e=1.999910e+01 f=19.999100 g=19.9991 G=19.9991!e=-1.9999e+01 f= -19.9991 g=      -20!e=1.9999e+01 f=  19.9991 g=       20!e=1.9999e+01 f=19.9991   g=20       !e=-1.9999e+01 f=-019.9991 g=-00000020!e=1.9999e+01 f=0019.9991 g=000000020!e=1.9999e+01 f=19.9991   g=20       !

Rebol

Rebol[Title:"Formatted Numeric Output"URL:http://rosettacode.org/wiki/Formatted_Numeric_Output]; Rebol has no built-in facilities for printing pictured output.; However, it's not too hard to cook something up using the; string manipulation facilities.zeropad:func["Pad number with zeros or spaces. Works on entire number."pad"Number of characters to pad to."n"Number to pad."/space"Pad with spaces instead."/localnncs][n:to-stringnc:" "s:""ifnotspace[c:"0"if#"-"=n/1[pad:pad-1n:copyskipn1s:"-"]]insert/dupnc(pad-length? n)insertnsn]; These tests replicate the C example output.print[zeropad/space9negate7.125]print[zeropad/space97.125]print7.125print[zeropad9negate7.125]print[zeropad97.125]print7.125
Output:
   -7.125    7.1257.125-0007.12500007.1257.125

REXX

/*REXX program shows various ways to  add leading zeroes  to numbers.   */a=7.125b=translate(format(a,10),0,' ')say'a='asay'b='bsayc=8.37d=right(c,20,0)say'c='csay'd='dsaye=19.46f='000000'esay'e='esay'f='fsayg=18.25e+1h=000000||gsay'g='gsay'h='hsayi=45.2j=translate('      'i,0," ")say'i='isay'j='jsayk=36.007l=insert(00000000,k,0)say'k='ksay'l='lsaym=.10055n=copies(0,20)msay'm='msay'n='nsayp=4.060q=0000000000000||psay'p='psay'q='qsayr=876s=substr(r+10000000,2)say'r='rsay's='ssayt=13.02u=reverse(reverse(t)000000000)say't='tsay'u='u/*stick a fork in it, we're done.*/
Output:
a= 7.125b= 0000000007.125c= 8.37d= 00000000000000008.37e= 19.46f= 00000019.46g= 18.25E+1h= 00000018.25E+1i= 45.2j= 00000045.2k= 36.007l= 0000000036.007m= .10055n= 00000000000000000000.10055p= 4.060q= 00000000000004.060r= 876s= 0000876t= 13.02u= 00000000013.02

Ring

decimals(3)see fixedprint(7.125, 5) + nlfunc fixedprint num, digs     for i = 1 to digs - len(string(floor(num)))         see "0"     next     see num + nl

RPL

Number formatting in RPL is at 1980s standards (ANSI BASIC X3J2, 1983 to be precise). If the user wants something else, she/he has to write some code, formatting the number as a string.

≪ 1 CFIF OVER 0 <THEN 1 SF 1 -END  SWAP ABS →STRWHILE DUP2 SIZE >REPEAT      "0" SWAP +ENDIF 1 FS?THEN "-" SWAP +END  SWAP DROP≫ 'TASK' STO
Input:
7.125 9 TASK-7.125 9 TASK
Output:
2: "00007.125"1: "-0007.125"

Ruby

r = 7.125printf " %9.3f\n",   r          #=>      7.125printf " %09.3f\n",  r          #=>  00007.125printf " %09.3f\n", -r          #=>  -0007.125printf " %+09.3f\n", r          #=>  +0007.125puts " %9.3f"  %  r             #=>      7.125puts " %09.3f" %  r             #=>  00007.125puts " %09.3f" % -r             #=>  -0007.125puts " %+09.3f" % r             #=>  +0007.125

Rust

fn main() {    let x = 7.125;    println!("{:9}", x);    println!("{:09}", x);    println!("{:9}", -x);    println!("{:09}", -x);}
Output:
    7.12500007.125   -7.125-0007.125

Sather

The Fill options should fill with any character, but it is still (!) not implemented; according toICSI Sather library documentation (GNU Sather library documentation is missing) works only for string, bools and characters, but a test has revealed it does not work in either way (yet) (GNU Sather v1.2.3).

class MAIN is  main is    #OUT + #FMT("<F0 #####.###>", 7.1257) + "\n";    #OUT + #FMT("<F0 #####.###>", 7.1254) + "\n";  end;end;

Luckly the C-like formats are supported too:

    #OUT + #FMT("%09.3f", 7.125) + "\n";

Scala

Library:Scala
Works with:Scala version 2.10.2

As shown in aScala Worksheet:

object FormattedNumeric {  val r = 7.125                                   //> r  : Double = 7.125  println(f" ${-r}%9.3f");                        //>     -7,125  println(f" $r%9.3f");                           //>      7,125  println(f" $r%-9.3f");                          //>  7,125      println(f" ${-r}%09.3f");                       //>  -0007,125  println(f" $r%09.3f");                          //>  00007,125  println(f" $r%-9.3f");                          //>  7,125      println(f" $r%+09.3f");                         //>  +0007,125}

Scheme

Works with:Gauche Scheme

Obtain the implementation of SRFI 54 fromhttp://srfi.schemers.org/srfi-54/srfi-54.htmland save it as "srfi-54.scm" in directoryGauche/share/gauche/site/lib/

(load "srfi-54.scm")(load "srfi-54.scm") ;; Don't ask.(define x 295643087.65432)(dotimes (i 4)  (print (cat x 25 3.0 #\0 (list #\, (- 4 i)))))
Output:
00000000002,9564,3087.6540000000000295,643,087.65400000002,95,64,30,87.65,4002,9,5,6,4,3,0,8,7.6,5,4

Seed7

$ include "seed7_05.s7i";  include "float.s7i";const proc: main is func  local    const float: r is 7.125;  begin    writeln( r digits 3 lpad 9);    writeln(-r digits 3 lpad 9);    writeln( r digits 3 lpad0 9);    writeln(-r digits 3 lpad0 9);    writeln( r digits 3);    writeln(-r digits 3);  end func;
Output:
    7.125   -7.12500007.125-0007.1257.125-7.125

Sidef

printf("%09.3f\n", 7.125);

or

say ("%09.3f" % 7.125);
Output:
00007.125

Smalltalk

Works with:Pharo 1.1.1
Transcript show: (7.125 printPaddedWith: $0 to: 3.6); cr."output: 007.125000"
Works with:Smalltalk/X
(7.123 asFixedPoint:3)  printOn: Transcript leftPaddedTo: 9 with: $0 "output: 00007.125"

notice that printOn:* is implemented in Object;thus any object can be printed with padding this way.

Using the PrintfScanf utility:

PrintfScanf new printf:'%08.3f' arguments: { 7.125 }

SQL

Works with:MS SQL version 2005
declare @n intselect @n=123select substring(convert(char(5), 10000+@n),2,4) as FourDigitsset @n=5print "TwoDigits: " + substring(convert(char(3), 100+@n),2,2)--Output: 05

Standard ML

print (StringCvt.padLeft #"0" 9 (Real.fmt (StringCvt.FIX (SOME 3)) 7.125) ^ "\n")
Works with:SML/NJ
print (Format.format "%09.3f\n" [Format.REAL 7.125])

Stata

Seeformat in Stata help.

. display %010.3f (57/8)000007.125

Suneido

Print(7.125.Pad(9))
Output:
00007.125

TAV

  print format '%09.3f;' 7.125  print pad left 7.125 to 9 by '0'


Tcl

set number 7.342format "%08.3f" $number
Output:

0007.432

Use withputs if output is desired to go to a channel.

Toka

needs valuesvalue n123 to n2 import printf" %08d" n printf

Ursala

The library function printf calls the host system's Clibrary function by that name and can cope with any ofthe same numeric formats.

#import flox = 7.125#show+t = <printf/'%09.3f' x>
Output:
00007.125

Vala

void main() {   double r = 7.125;  print(" %9.3f\n", -r);   print(" %9.3f\n",r);  print(" %-9.3f\n",r);  print(" %09.3f\n",-r);  print(" %09.3f\n",r);  print(" %-09.3f\n",r);}
Output:
    -7.125     7.125 7.125 -0007.125 00007.125 7.125

Vedit macro language

Vedit only supports integers, but fixed point calculations can be used for decimal values.
The following example uses 3 decimal places (value scaled by 1000). The output is inserted at current edit position.

#1 = 7125Num_Ins(#1, FILL+COUNT, 9) Char(-3) Ins_Char('.')
Output:
 00007.125

V (Vlang)

fn main() {// refer to string interpolation and format place holding in documentation// pad with zeros towards the leftnum := 7.125println("${num:09f}")}
Output:
00007.125

Wren

Library:Wren-fmt
import "./fmt" for Fmtvar n = 7.125System.print(Fmt.rjust(9, n, "0"))
Output:
00007.125

XPL0

int C;[Format(5, 3);                  \5 places before decimal point and 3 afterRlOut(8, 7.125);                \output real number to internal bufferloop    [C:= ChIn(8);           \read character from internal buffer        if C = ^  then C:= ^0;  \change leading space characters to zeros        if C = $1A then quit;   \exit loop on end-of-file (EOF = end of chars)        ChOut(0, C);            \display digit character on terminal        ];]
Output:
00007.125

XSLT

<xsl:value-of select="format-number(7.125, '00000000.#############')" />

zkl

"%09.3f".fmt(7.125)   //-->"00007.125""%09.3e".fmt(7.125)   //-->"7.125e+00""%09.3g".fmt(7.125)   //-->"000007.12""%09d".fmt(7.125)     //-->"000000007""%09,d".fmt(78901.125)//-->"00078,901"
Retrieved from "https://rosettacode.org/wiki/Formatted_numeric_output?oldid=395329"
Categories:
Hidden category:
Cookies help us deliver our services. By using our services, you agree to our use of cookies.

[8]ページ先頭

©2009-2026 Movatter.jp