Skip to content

Instantly share code, notes, and snippets.

@sorcerykid
Created December 11, 2024 00:45
Show Gist options
  • Save sorcerykid/00eb43d34a14373bc72810a64c0876e0 to your computer and use it in GitHub Desktop.
Save sorcerykid/00eb43d34a14373bc72810a64c0876e0 to your computer and use it in GitHub Desktop.
ANSI C-like sprintf() helper for Javascript, with support for alignment and field widths
function sprintf( )
{
let regex = /%([-0])?([0-9]+)?(\.[0-9]+)?([sdf%])/g;
let args = arguments;
let tmpl = args[ 0 ];
let idx = 1;
return tmpl.replace( regex, function ( exp, p0, p1, p2, p3 )
{
if( exp == '%%' )
return '%';
else if( idx >= args.length )
return 'undefined';
let type = p3;
let prec = p2 != undefined ? parseInt( p2.substr( 1 ) ) : 6;
let size = p1 != undefined ? parseInt( p1 ) : 0;
let fill = p0 == '0' && type != 's' ? '0' : ' ';
let is_sign = type != 's' && args[ idx ] < 0;
let is_left = p0 == '-';
let str;
switch( type ) {
case 's':
str = args[ idx ];
break;
case 'd':
str = parseFloat( args[ idx ] ).toFixed( 0 );
break;
case 'f':
str = parseFloat( args[ idx ] ).toFixed( prec );
break;
}
while( str.length < size ) {
str = is_left ? str + ' ' : fill + str;
if( fill == '0' && !is_left && is_sign )
str = '-0' + str.substr( 2 ); // fun corner case!
}
idx++;
return str;
} )
}
<script>
document.writeln( '<pre>' );
document.writeln( sprintf( '%-20s %5s %6s', 'Item', 'SKU', 'Cost' ) );
document.writeln( '-----------------------------------' );
document.writeln( sprintf( '%-20s #%04d %6.2f', 'Wool Coat', 64, 21.10 ) );
document.writeln( sprintf( '%-20s #%04d %6.2f', 'Blue Jeans', 311, 19.50 ) );
document.writeln( sprintf( '%-20s #%04d %6.2f', 'Mittens', 204, 8.25 ) );
document.writeln( sprintf( '%-20s #%04d %6.2f', 'Leather Jacket', 78, 112.50 ) );
document.writeln( sprintf( '%-20s #%04d %6.2f', 'Work Boots', 125, 35.00 ) );
document.writeln( '-----------------------------------' );
document.writeln( '</pre>' );
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment