0

我有一个应用程序将变量发送到另一个系统,该系统要求变量为 16 个字符。但是,用户不需要输入 16 位数字。

这是我到目前为止的编码:

在文件中激活javascript:

<A HREF="javascript:onClick=creditlink()" title="Enter own credit memo number.">Create Credit Memo</a>

这是我正在使用的javascript:

function creditlink ()
{
var cmnum2 = document.getElementById('creditmemo').value;
var cmnum = document.getElementById('autocmnum').value;
var clmid = document.getElementById('claimid').value;
//alert (cmnum);
if (cmnum2) {


window.open("https://somewebpage.cfm?creditmemos=" + cmnum2 + "&claimid=" +clmid );
}
//This is the customer did not want to enter their own number one would be auto generated
else {

window.open("https://somewebpage.cfm?creditmemos=" + cmnum + "&claimid=" +clmid );

}

}

因此,在这里我需要 cmnum2 的帮助时,我需要将其转换为 16 个字符,然后才能在链接中发送。仅供参考,此功能效果很好。

所以我的想法是在值之前添加空格填充以等于 16 个字符。这是我需要的示例:

用户输入:cmnum2 = "61150331" (8 个字符) 新值:cmnum2 = "(8 个空格)61150331" (总共 16 个字符,带空格)

我相信我已经看到它使用 string.format 或 string padleft 或 padright 之类的函数完成了,但我不确定编码格式如何工作以使其成为 16,无论值是什么。

4

4 回答 4

1

这是一个使用 ES6 (Harmony) 函数的示例,String.prototype.repeat。我已经为你包含了 polyfils,或者你可以使用ES6 shim。无论如何,这只是可以做什么以及将成为标准的进一步示例。

Javascript

// ES6 - Harmony polyfils
if (typeof Math.sign !== "function") {
    Math.sign = function (n) {
        if (n < 0) {
            return -1;
        }

        return 1;
    };
}

if (typeof Number.toInteger !== "function") {
    Number.toInteger = function (value) {
        var n = +value;

        if (isNaN(n)) {
            return +0;
        }

        if (n === 0 || !isFinite(n)) {
            return n;
        }

        return Math.sign(n) * Math.floor(Math.abs(n));
    }
}

if (typeof String.prototype.repeat !== "function") {
    String.prototype.repeat = (function () {
        var repeat = function (s, times) {
            if (times < 1) {
                return "";
            }

            if (times % 2) {
                return repeat(s, times - 1) + s;
            }

            var half = repeat(s, times / 2);

            return half + half;
        };

        return function (times) {
            times = Number.toInteger(times);
            if (times < 0 || times === Infinity) {
                throw new RangeError();
            }

            return repeat(String(this), times);
        };
    }());
}

// Helper function
function clamp(num, min, max) {
    return Math.min(Math.max(num, min), max);
};

// The padding function
function pad(userString) {
    return " ".repeat(clamp(16 - userString.length, 0, 16)) + userString;
}

// Example usage
var input = "12345",
    output = pad(input);

console.log(input, input.length, output, output.length);

输出

12345 5            12345 16 

jsfiddle

于 2013-08-29T21:54:25.200 回答
0

实现此目的的一种简单方法是使用 while 循环:

while (cmnum2.length < 16) {
   cmnum2 = " " + cnmun2
}

但是,您可能希望将其放在函数中并返回带有空格的新字符串。

var cmnum2 = "09872";

var num = function(cmnum2){
    while (cmnum2.length < 16) {
      cmnum2 = " " + cmnum2;
    }
    return cmnum2;
};

console.log(num(cmnum2)); //"(11spaces)09872"

希望有帮助。

于 2013-08-29T21:51:25.393 回答
0

这是一种可能的解决方案。请注意,如果字符串已经是 16 个(或更多)字符,for则永远不会进入循环。

function padTo16Chars(string) {
    var length = string.length;
    var newString = "";
    for (var index = 0; index < (16 - length) ; index++) {
        newString = newString + " ";
    }
    string = newString + string;
}

为此,请在您的方法中调用此creditlink方法,如下所示:

function creditlink ()
{
    var cmnum2 = document.getElementById('creditmemo').value;
    padTo16Chars(cmnum2);
    //Other stuff
}

编辑:填充在值之后,现在在之前。

于 2013-08-29T20:36:48.487 回答
0

我真的很喜欢 Xotic750 的回答。我还有别的东西:

/**
 * @description Pads given string 
 * @param {string} s The string to pad
 * @param {number} n The amount of spaces to pad
 * @returns {string} Left padded string.
 * @todo check parameters' types and allowed values, undefined, etc.
 */
function padLeft(s,n) {
    return ((s.length >= n) ? s : (new Array(n - s.length)).join(" ") + s);
}

这是一个非常简单的解决方案......

于 2015-11-01T18:46:20.527 回答