J'ai besoin de vérifier si justPrices[i].substr(commapos+2,1) .
La chaîne est quelque chose comme: "blabla, 120"
Dans ce cas, il vérifierait si «0» est un nombre. Comment cela peut-il être fait?
J'ai besoin de vérifier si justPrices[i].substr(commapos+2,1) .
La chaîne est quelque chose comme: "blabla, 120"
Dans ce cas, il vérifierait si «0» est un nombre. Comment cela peut-il être fait?
Réponses:
Vous pouvez utiliser des opérateurs de comparaison pour voir s'il se trouve dans la plage de caractères numériques:
var c = justPrices[i].substr(commapos+2,1);
if (c >= '0' && c <= '9') {
// it is a number
} else {
// it isn't
}
vous pouvez utiliser parseIntet vérifier avecisNaN
ou si vous voulez travailler directement sur votre chaîne, vous pouvez utiliser une expression régulière comme ceci:
function is_numeric(str){
return /^\d+$/.test(str);
}
function is_numeric_char(c) { return /\d/.test(c); }
is_numeric_char("foo1bar") == true). si vous voulez vérifier un caractère numérique, ce /^\d$/.test(c)serait une meilleure solution. mais de toute façon, ce n'était pas la question :)
EDIT: La réponse mise à jour de Blender est la bonne réponse ici si vous ne vérifiez qu'un seul caractère (à savoir !isNaN(parseInt(c, 10)) ). Ma réponse ci-dessous est une bonne solution si vous souhaitez tester des chaînes entières.
Voici l' isNumericimplémentation de jQuery (en JavaScript pur), qui fonctionne avec des chaînes complètes :
function isNumeric(s) {
return !isNaN(s - parseFloat(s));
}
Le commentaire de cette fonction se lit comme suit:
// parseFloat NaNs faux positifs à conversion numérique (null | true | false | "")
// ... mais interprète mal les chaînes de nombres de début, en particulier les littéraux hexadécimaux ("0x ...")
// la soustraction force l'infini à NaN
Je pense que nous pouvons être sûrs que ces gars ont passé pas mal de temps là-dessus!
Je me demande pourquoi personne n'a publié une solution comme:
var charCodeZero = "0".charCodeAt(0);
var charCodeNine = "9".charCodeAt(0);
function isDigitCode(n) {
return(n >= charCodeZero && n <= charCodeNine);
}
avec une invocation comme:
if (isDigitCode(justPrices[i].charCodeAt(commapos+2))) {
... // digit
} else {
... // not a digit
}
Vous pouvez utiliser ceci:
function isDigit(n) {
return Boolean([true, true, true, true, true, true, true, true, true, true][n]);
}
Ici, je l'ai comparé à la méthode acceptée: http://jsperf.com/isdigittest/5 . Je ne m'attendais pas à grand-chose, donc j'ai été assez surpris quand j'ai découvert que la méthode acceptée était beaucoup plus lente.
Ce qui est intéressant, c'est que bien que la méthode acceptée soit une entrée correcte plus rapide (par exemple '5') et plus lente pour incorrect (par exemple 'a'), ma méthode est exactement opposée (rapide pour incorrect et plus lente pour correcte).
Pourtant, dans le pire des cas, ma méthode est 2 fois plus rapide que la solution acceptée pour une entrée correcte et plus de 5 fois plus rapide pour une entrée incorrecte.
!!([!0, !0, !0, !0, !0, !0, !0, !0, !0, !0][n]);Il a un grand potentiel WTF et fonctionne assez bien (échoue 007).
"length"(et d'autres attributs trouvés sur les tableaux) sont des chiffres: P
Je pense que c'est très amusant de trouver des moyens de résoudre ce problème. En voici quelques-uns.
(Toutes les fonctions ci-dessous supposent que l' argument est un seul caractère. Remplacez parn[0] pour l'appliquer)
function isCharDigit(n){
return !!n.trim() && n > -1;
}
function isCharDigit(n){
return !!n.trim() && n*0==0;
}
function isCharDigit(n){
return !!n.trim() && !!Number(n+.1); // "+.1' to make it work with "." and "0" Chars
}
var isCharDigit = (function(){
var a = [1,1,1,1,1,1,1,1,1,1];
return function(n){
return !!a[n] // check if `a` Array has anything in index 'n'. Cast result to boolean
}
})();
function isCharDigit(n){
return !!n.trim() && !isNaN(+n);
}
var str = ' 90ABcd#?:.+', char;
for( char of str )
console.log( char, isCharDigit(char) );
truedes méthodes 1, 2, 3 et 5 pour " ".
charCodeAt()comparaison - qui était presque 4x plus rapide - jsperf.com/isdigit3
Fonction simple
function isCharNumber(c){
return c >= '0' && c <= '9';
}
Je suggère une simple regex.
Si vous recherchez uniquement le dernier caractère de la chaîne:
/^.*?[0-9]$/.test("blabla,120"); // true
/^.*?[0-9]$/.test("blabla,120a"); // false
/^.*?[0-9]$/.test("120"); // true
/^.*?[0-9]$/.test(120); // true
/^.*?[0-9]$/.test(undefined); // false
/^.*?[0-9]$/.test(-1); // true
/^.*?[0-9]$/.test("-1"); // true
/^.*?[0-9]$/.test(false); // false
/^.*?[0-9]$/.test(true); // false
Et l'expression régulière est encore plus simple si vous ne vérifiez qu'un seul caractère comme entrée:
var char = "0";
/^[0-9]$/.test(char); // true
La solution la plus courte est:
const isCharDigit = n => n < 10;
Vous pouvez également les appliquer:
const isCharDigit = n => Boolean(++n);
const isCharDigit = n => '/' < n && n < ':';
const isCharDigit = n => !!++n;
si vous souhaitez vérifier plus d'un chatacter, vous pouvez utiliser les variantes suivantes
Expression régulière:
const isDigit = n => /\d+/.test(n);
Comparaison:
const isDigit = n => +n == n;
Vérifiez si ce n'est pas NaN
const isDigit = n => !isNaN(n);
isNumber = function(obj, strict) {
var strict = strict === true ? true : false;
if (strict) {
return !isNaN(obj) && obj instanceof Number ? true : false;
} else {
return !isNaN(obj - parseFloat(obj));
}
}
sortie sans mode strict:
var num = 14;
var textnum = '14';
var text = 'yo';
var nan = NaN;
isNumber(num);
isNumber(textnum);
isNumber(text);
isNumber(nan);
true
true
false
false
sortie en mode strict:
var num = 14;
var textnum = '14';
var text = 'yo';
var nan = NaN;
isNumber(num, true);
isNumber(textnum, true);
isNumber(text, true);
isNumber(nan);
true
false
false
false
Similaire à l'une des réponses ci-dessus, j'ai utilisé
var sum = 0; //some value
let num = parseInt(val); //or just Number.parseInt
if(!isNaN(num)) {
sum += num;
}
Cet article de blog apporte un peu plus de lumière sur cette vérification si une chaîne est numérique en Javascript | Typographie et ES6
Une solution simple en tirant parti de la vérification de type dynamique du langage:
function isNumber (string) {
//it has whitespace
if(string.trim() === ''){
return false
}
return string - 0 === string * 1
}
voir les cas de test ci-dessous
Cela semble fonctionner:
Liaison statique:
String.isNumeric = function (value) {
return !isNaN(String(value) * 1);
};
Reliure prototype:
String.prototype.isNumeric = function () {
return !isNaN(this.valueOf() * 1);
};
Il vérifiera les caractères uniques, ainsi que les chaînes entières pour voir si elles sont numériques.
function is_numeric(mixed_var) {
return (typeof(mixed_var) === 'number' || typeof(mixed_var) === 'string') &&
mixed_var !== '' && !isNaN(mixed_var);
}
Vous pouvez essayer ceci (a fonctionné dans mon cas)
Si vous souhaitez tester si le premier caractère d'une chaîne est un entier:
if (parseInt(YOUR_STRING.slice(0, 1))) {
alert("first char is int")
} else {
alert("first char is not int")
}
Si vous voulez tester si le char est un int:
if (parseInt(YOUR_CHAR)) {
alert("first char is int")
} else {
alert("first char is not int")
}
Cette fonction fonctionne pour tous les cas de test que j'ai pu trouver. C'est aussi plus rapide que:
function isNumeric (n) {
if (!isNaN(parseFloat(n)) && isFinite(n) && !hasLeading0s(n)) {
return true;
}
var _n = +n;
return _n === Infinity || _n === -Infinity;
}
var isIntegerTest = /^\d+$/;
var isDigitArray = [!0, !0, !0, !0, !0, !0, !0, !0, !0, !0];
function hasLeading0s(s) {
return !(typeof s !== 'string' ||
s.length < 2 ||
s[0] !== '0' ||
!isDigitArray[s[1]] ||
isIntegerTest.test(s));
}
var isWhiteSpaceTest = /\s/;
function fIsNaN(n) {
return !(n <= 0) && !(n > 0);
}
function isNumber(s) {
var t = typeof s;
if (t === 'number') {
return (s <= 0) || (s > 0);
} else if (t === 'string') {
var n = +s;
return !(fIsNaN(n) || hasLeading0s(s) || !(n !== 0 || !(s === '' || isWhiteSpaceTest.test(s))));
} else if (t === 'object') {
return !(!(s instanceof Number) || fIsNaN(+s));
}
return false;
}
function testRunner(IsNumeric) {
var total = 0;
var passed = 0;
var failedTests = [];
function test(value, result) {
total++;
if (IsNumeric(value) === result) {
passed++;
} else {
failedTests.push({
value: value,
expected: result
});
}
}
// true
test(0, true);
test(1, true);
test(-1, true);
test(Infinity, true);
test('Infinity', true);
test(-Infinity, true);
test('-Infinity', true);
test(1.1, true);
test(-0.12e-34, true);
test(8e5, true);
test('1', true);
test('0', true);
test('-1', true);
test('1.1', true);
test('11.112', true);
test('.1', true);
test('.12e34', true);
test('-.12e34', true);
test('.12e-34', true);
test('-.12e-34', true);
test('8e5', true);
test('0x89f', true);
test('00', true);
test('01', true);
test('10', true);
test('0e1', true);
test('0e01', true);
test('.0', true);
test('0.', true);
test('.0e1', true);
test('0.e1', true);
test('0.e00', true);
test('0xf', true);
test('0Xf', true);
test(Date.now(), true);
test(new Number(0), true);
test(new Number(1e3), true);
test(new Number(0.1234), true);
test(new Number(Infinity), true);
test(new Number(-Infinity), true);
// false
test('', false);
test(' ', false);
test(false, false);
test('false', false);
test(true, false);
test('true', false);
test('99,999', false);
test('#abcdef', false);
test('1.2.3', false);
test('blah', false);
test('\t\t', false);
test('\n\r', false);
test('\r', false);
test(NaN, false);
test('NaN', false);
test(null, false);
test('null', false);
test(new Date(), false);
test({}, false);
test([], false);
test(new Int8Array(), false);
test(new Uint8Array(), false);
test(new Uint8ClampedArray(), false);
test(new Int16Array(), false);
test(new Uint16Array(), false);
test(new Int32Array(), false);
test(new Uint32Array(), false);
test(new BigInt64Array(), false);
test(new BigUint64Array(), false);
test(new Float32Array(), false);
test(new Float64Array(), false);
test('.e0', false);
test('.', false);
test('00e1', false);
test('01e1', false);
test('00.0', false);
test('01.05', false);
test('00x0', false);
test(new Number(NaN), false);
test(new Number('abc'), false);
console.log('Passed ' + passed + ' of ' + total + ' tests.');
if (failedTests.length > 0) console.log({
failedTests: failedTests
});
}
testRunner(isNumber)
Autant que je sache, le moyen le plus simple est simplement de multiplier par 1:
var character = ... ; // your character
var isDigit = ! isNaN(character * 1);
La multiplication par un fait un nombre à partir de n'importe quelle chaîne numérique (comme vous n'avez qu'un seul caractère, ce sera toujours un entier de 0 à 9) et un NaNpour toute autre chaîne.
Juste utiliser isFinite
const number = "1";
if (isFinite(number)) {
// do something
}