我在 Javascript 中有一个数字,我知道它小于 10000 并且也是非负数。我想将其显示为四位数字,并带有前导零。还有比下面这个更优雅的吗?
if(num<10) num="000"+num;
else if(num<100) num="00"+num;
else if(num<1000) num="0"+num;
我想要一些内置于 Javascript 中的东西,但我似乎找不到任何东西。
我能想到的最简单的方法是:
("000" + num).slice(-4)
填充的数字是一个字符串。
当您将数字添加到字符串时,它会转换为字符串。
字符串有方法 slice,它返回字符串的固定长度片段。
如果长度为负,则返回的字符串将从字符串末尾开始切片。
测试:
var num=12;
console.log(("000" + num).slice(-4)); // Will show "0012"
当然,这只适用于最多 4 位的正整数。稍微复杂的解决方案将处理正整数:
'0'.repeat( Math.max(4 - num.toString().length, 0)) + num
通过重复添加零来创建字符串,只要位数(字符串长度)小于 4 添加数字,然后也将其转换为字符串。
编辑:从现在开始你可能应该使用这个功能:
String(num).padStart(4,'0')
它仍然无法处理负数...
从 ES2017 开始,可以简单地填充到最小长度 String.prototype.padStart 和 String.prototype.padEnd:
let number = 3
let string = number.toString().padStart(3, '0')
console.log(string) // "003"
或者如果只有浮动的整个部分应该是固定长度:
let number = 3.141
let array = number.toString().split('.')
array[0] = array[0].padStart(3, '0')
let string = array.join('.')
console.log(string) // "003.141"
这些简单的方法都没有使用句柄符号,仅在数字不是整数时显示小数部分,或其他场景 - 所以这里是一个不带选项的简单示例格式化函数:
function format (number) {
let [ integer, fraction = '' ] = number.toString().split('.')
let sign = ''
if (integer.startsWith('-')) {
integer = integer.slice(1)
sign = '-'
}
integer = integer.padStart(3, '0')
if (fraction) {
fraction = '.' + fraction.padEnd(6, '0')
}
let string = sign + integer + fraction
return string
}
console.log(format(3)) // "003"
console.log(format(-3)) // "-003"
console.log(format(4096)) // "4096"
console.log(format(-3.141)) // "-003.141000"
尽管值得注意的是,这不会处理非数字的事物,或将数字字符串转换为科学记数法的事物。
我认为 JavaScript 语言中没有“内置”任何东西来做到这一点。这是一个执行此操作的简单函数:
function FormatNumberLength(num, length) {
var r = "" + num;
while (r.length < length) {
r = "0" + r;
}
return r;
}
FormatNumberLength(10000, 5) outputs '10000'
FormatNumberLength(1000, 5) outputs '01000'
FormatNumberLength(100, 5) outputs '00100'
FormatNumberLength(10, 5) outputs '00010'
这可能有帮助:
String.prototype.padLeft = function (length, character) {
return new Array(length - this.length + 1).join(character || '0') + this;
}
var num = '12';
alert(num.padLeft(4, '0'));
一种有趣(但有趣)的用零作为数字前缀的方法:
function FormatInteger(num, length) {
return (num / Math.pow(10, length)).toFixed(length).substr(2);
}
国际化 API 的数字格式甚至可以做到这一点:
const digits3 =
new Intl.NumberFormat(
undefined,
{ minimumIntegerDigits: 3, maximumSignificantDigits: 3 });
digits3.format(42);
这样的事情怎么样:
function prefixZeros(number, maxDigits)
{
var length = maxDigits - number.toString().length;
if(length <= 0)
return number;
var leadingZeros = new Array(length + 1);
return leadingZeros.join('0') + number.toString();
}
//Call it like prefixZeros(100, 5); //Alerts 00100
我认为最紧凑但直观的方法是:
function toFixedLength(input, length, padding) {
padding = String(padding || "0");
return (padding.repeat(length) + input).slice(-length);
}
如果对编码人员来说更直观,可以将此处的
slice
方法替换为 substr
。
我是来寻找答案的,但我认为这是一种更好的函数式方法(ES6):
const formatNumberToString = (num, minChars) => {
return num.toString().length < minChars
? formatNumberToString(`0${num}`, minChars)
: num.toString()
}
// formatNumberToString(12, 4) // "0012"
// formatNumberToString(12, 5) // "00012"
// formatNumberToString(1, 4) // "0001"
// formatNumberToString(1, 2) // "01"
// formatNumberToString(12, 2) // "12"
// formatNumberToString(12, 1) // "12"
而且,这只需一行即可实现
最新 ES6 repeat() 方法:
const length_required = 5;
let num = 10;
num = "0".repeat(length_required - String(num).length) + num;
console.log(num)
// output: 00010
let num = 1000;
num = "0".repeat(length_required - String(num).length) + num;
console.log(num)
// output: 01000
你可能会对这些方法感到疯狂:
function PadDigits(input, totalDigits)
{
var result = input;
if (totalDigits > input.length)
{
for (i=0; i < (totalDigits - input.length); i++)
{
result = '0' + result;
}
}
return result;
}
但这并不会让生活变得更轻松。 C# 在 String 类中有像 PadLeft 和 PadRight 这样的方法,不幸的是 Javascript 没有内置此功能
我遇到了同样的问题,我找到了一种紧凑的方法来解决它。如果我必须在代码中多次使用它,或者如果我要使用超过四位数字,我会使用其他建议的解决方案之一,但这种方式可以让我将其全部放在一个表达式中:
((x<10)?"000": (x<100)?"00": (x<1000)?"0": "") + x
它实际上与您的代码相同,但使用三元运算符而不是“if-else”语句(并移动“+ x”,它始终是表达式的一部分,位于条件代码之外)。
另一张:
function format_number_length(num, length) {
var r = num.toString();
if (r.length<length) r = Array(length - r.length + 1).join('0') + r;
return r;
}
在 JavaScript 中,我们有字符串方法 padStart。
这是示例 https://www.w3schools.com/js/js_string_methods.asp
let numb = 5;
let text = numb.toString();
let padded = text.padStart(4, "0");
这太复杂了!!! Em PASCAL fica assim:
a:字符串;
a:=FormatFloat('0000', 89); //结果:0089 a:=FormatFloat('#,#0.00', 89); //结果:89,00
Não tem alguma coisa em JavaScript 类似于 isso não?
“while”循环应该使这变得足够简单。
function formatLength(a) {
var num = document.getElementById(a)
while (num.value.length < 4) {
num.value = '0' + num.value
}
}
这将循环直到 num 值的长度达到 4 位(假设您已传入 number 元素的 id 作为参数)
我知道这个问题有点老了,但是对于任何在 Java 或 Python 上寻找类似于字符串格式化的人来说,我有这些辅助方法:
String.format = (...args) => {
if( args.length == 0 ){
throw new Error("String format error: You must provide at least one argument");
}
const delimiter = "@LIMIT*";
const format = String(args.shift(1,0)).replace(/(%[0-9]{0,}[sd])/g, delimiter+"$1"+delimiter).split(delimiter); // First element is the format
if( [...format].filter(el=>el.indexOf("%")>-1).length != args.length ){
throw new Error("String format error: Arguments must match pattern");
}
if( format.length == 1 && args.length == 0 ){
return String(format);
}
let formattedString = "";
// patterns
const decimalPattern = /%[0-9]{0,}d/;
const stringPattern = /%s/;
if( format.length == 0 ){
throw new Error("String format error: Invalid format");
}
let value = null;
let indexOfParam = 0;
let currPattern = null;
while( args.length > 0 ) {
currPattern = format[indexOfParam];
indexOfParam++;
if( currPattern.indexOf("%")<0 ){
formattedString+=currPattern;
continue;
}
value = args.shift(0,1);
if( decimalPattern.test(currPattern) ){
let numberLength = parseInt(currPattern.replace(/[^0-9]/g,''));
if( isNaN(numberLength) ){
numberLength = 0;
}
formattedString+=numberToLength(value, numberLength);
} else if( stringPattern.test(currPattern) ) {
if( typeof value === 'object' && value.toSource ){
formattedString+=String(value.toSource());
} else {
formattedString+=String(value);
}
} else {
throw new Error("String format error: Unrecognized pattern:"+currPattern);
}
}
return formattedString;
}
const numberToLength = (number, length) => {
length = parseInt(length);
number = String(number);
if( isNaN(length) || isNaN(parseInt(number)) ){
throw new Error("Invalid number passed");
}
while( number.length < length ) {
number = "0" + number;
}
return number;
}