UNPKG

printfy

Version:

C-style printf formatting for JavaScript with padding and precision.

11 lines 5.34 kB
/** * printfy pure JavaScript Libaray v2.0.2 * A lightweight JavaScript library implements C-style `printf` functionality. * https://github.com/jsvibe/printfy * * @license MIT License * @author Indian Modassir * * Date: 01 August 2025 08:27 GMT+05030 */ (function(global){"use strict";var SAFE_INT=Number.MAX_SAFE_INTEGER;var MAX_DECIMAL=53;var arr=[];var concat=arr.concat;var slice=arr.slice;var Console=console;var methods={printf:printf,vprintf:vprintf,sprintf:sprintf,vsprintf:vsprintf};var rspecifier=/(?<!%)%(?:(?:(\d+\$|)((?:[0\x20])?(?:\'.)?|)([+-]|)(\d+|)(\.\d+|)([a-z]))|(%))/gi;var specifiers={b:function(value,padding,flag,width){return numWith(value.toString(2),padding,flag,width)},c:function(value,padding,flag,width){value=value<0?"":value;return numWith(String.fromCharCode(value),padding,flag,width)},d:function(value,padding,flag,width){return numWith(value,padding,flag,width)},o:function(value,padding,flag,width){var us64=(BigInt(1)<<BigInt(64))+BigInt(value);value=(value<0?us64:value).toString(8);return numWith(value,padding,flag,width)},u:function(value,padding,flag,width){value=parseInt(value)||0;value=((BigInt(value)+2n**64n)%2n**64n).toString();return numWith(value,padding,flag,width)},x:function(value,padding,flag,width){var us64=(BigInt(1)<<BigInt(64))+BigInt(value);value=(value<0?us64:value).toString(16);return numWith(value,padding,flag,width)},X:function(value,padding,flag,width){return this.x(value,padding,flag,width).toUpperCase()},e:function(value,padding,flag,width,precision,origVal){value=value.toExponential(precision);return numWith(InfNaN(origVal,value),padding,flag,width)},E:function(value,padding,flag,width,precision,origVal){return this.e(value,padding,flag,width,precision,origVal).toUpperCase()},f:function(value,padding,flag,width,precision,origVal){value=value.toLocaleString(undefined,{minimumFractionDigits:precision,maximumFractionDigits:precision,useGrouping:false});return numWith(InfNaN(origVal,value),padding,flag,width)},F:function(value,padding,flag,width,precision,origVal){value=value.toFixed(precision);return numWith(InfNaN(origVal,value),padding,flag,width)},g:function(value,padding,flag,width,precision,origVal){var X,formatted,regNoFloat=/(\.|0)+$/,strExp=this.e(value,"","",null,precision),regExp=/e([+-]?\d+)/;X=+(regExp.exec(strExp)||[])[1];if(precision>X&&X>=-4){formatted=this.f(value,"","",null,Math.max(precision-(X+1),0),origVal)}else{formatted=this.e(value,"","",null,Math.max(precision-1,0),origVal)}value=precision<=16?formatted.replace(regNoFloat,""):formatted;return this.s(value,padding,flag,width)},G:function(value,padding,flag,width,precision,origVal){return this.g(value,padding,flag,width,precision,origVal).toUpperCase()},s:function(value,padding,flag,width,precision){return strWith(value,padding,flag,width,precision)},S:function(value,padding,flag,width,precision){return this.s(value,padding,flag,width,precision).toUpperCase()}};function InfNaN(value,force){return Number.isNaN(value)||Math.abs(value)===Infinity?value:force}function strWith(value,padding,flag,width,precision){value=value.slice(0,precision)||value;return setPadding(value,padding,flag,width)}function numWith(value,padding,flag,width){return setPadding(value+"",padding,flag,width,true)}function setPadding(value,padding,flag,width,isNumeric){padding=padding.replace(/^'/g,"")||" ";width=+width-value.length;if(width>SAFE_INT){throw new RangeError("The width value you entered exceeds this limit:"+width)}if(width>0){padding=padding.repeat(width);value=flag==="-"?value+padding:(isNumeric&&(value=flag+value),padding+value)}else if(isNumeric){value=flag+value}return value}function formatHandle(values,i){return function(){var value,precision,args=arguments,regFloatSpec=/^(f|F|g|G|E|e)$/,specifier=args[6],fn=specifiers[specifier],regStrSpec=/^s$/i,arg=args[1];if(arguments[7]){return"%"}args=slice.call(arguments,2,-3);if(!fn){throw new Error('ValueError: Unknown format specifier "'+specifier+'"')}value=values[i];precision=args[3]?+args[3].slice(1):0;args[3]=regFloatSpec.test(specifier)&&!args[3]?6:precision;if(precision>MAX_DECIMAL){throw new Error("Requested precision of "+precision+" digits was truncated to JS maximum of "+MAX_DECIMAL+" digits")}if(arg){value=values[parseInt(arg)-1]}args.push(value);args.unshift(regStrSpec.test(specifier)?value+"":(regFloatSpec.test(specifier)?parseFloat(value):parseInt(value))||0);i++;return fn.apply(specifiers,args)}}function formatNow(format,values){var i=0,matches=format.match(rspecifier)||[],rswap=/(\d+)(?=\$)/g,sl=matches.length,vl=values.length;if(matches=format.match(rswap)){sl=Math.max.apply(null,matches||[])}if(sl>vl){throw new Error("ArgumentCountError: "+sl+" argument are required, "+vl+" given")}return format.replace(rspecifier,formatHandle(values,i))}function printf(format,values){Console.log(formatNow(format,slice.call(arguments,1)))}function vprintf(format,values){values.unshift(format);printf.apply(this,values)}function sprintf(format,values){return formatNow(format,slice.call(arguments,1))}function vsprintf(format,values){values.unshift(format);return sprintf.apply(this,values)}typeof define==="function"&&define.amd?define(function(){return methods}):Object.assign(typeof module==="object"?module.exports:global,methods);return methods})(typeof window!=="undefined"?window:this);