Formating Numbers
Part of TutorialIntermediate
Description
This function takes a number as a char array and inserts commas in the right places; "1000" becomes "1,000", etc.; for numbers smaller than that, it just returns the original.
Some overloads were added so that some integers can be converted, too. Negative values and floating-point numbers (which aren't handled yet) would require more code.
Example
import std.string; /* for StringException */ string formatNumber(int i) { return formatNumber(toString(i)); } string formatNumber(long i) { return formatNumber(toString(i)); } string formatNumber(bool i) { return formatNumber(toString(i)); } string formatNumber(string n) { char[] number=n.dup; for(int i=n.length-3; i>=1; i-=3) { if(!std.ctype.isdigit(number[i])) throw new StringException("expected digits:"~n); else number=number[0..i]~","~number[i..$]; } return number; } version(example) import std.stdio; /* for writefln (for un) */ unittest { version(example) writefln("Running unittest..."); assert(formatNumber("100")=="100"); assert(formatNumber("1000")=="1,000"); assert(formatNumber("10000000")=="10,000,000"); version(example) writefln("unittest Passed!"); } version(example) void main() /* Usage Example */ { writefln(formatNumber(1)); writefln(formatNumber(12)); writefln(formatNumber(123)); writefln(formatNumber(1234)); writefln(formatNumber(12345)); writefln(formatNumber(123456)); writefln(formatNumber(1234567)); writefln(formatNumber(12345678)); writefln(formatNumber(123456789)); writefln(formatNumber(1234567890)); }
Compilation Tips
- Compile with -version=example to run example.
- Compile with -unittest to run unittests when the program is run.
Batch File
@echo off dmd FormatNumberExample.d -c dmd FormatNumberExample.d -unittest -version=example dmd FormatNumberExample.d -version=example FormatNumberExample.exe pause erase FormatNumberExample.obj erase FormatNumberExample.map erase FormatNumberExample.exe
Console Output
c:\dmd\bin\..\..\dm\bin\link.exe string,,,user32+kernel32/noi; c:\dmd\bin\..\..\dm\bin\link.exe string,,,user32+kernel32/noi; 1 12 123 1,234 12,345 123,456 1,234,567 12,345,678 123,456,789 1,234,567,890 Press any key to continue . . .
Source
- Based on digitalmars.D/32149 by Ameer Armaly.
- Corrected to get unittest to pass by J C Calvarese.
Testing
Tested with Digital Mars D Compiler v0.143 on Windows 2000.