我有一个分配给变量的数字,如下所示:
var myVar = 1234;
现在我想从该数字中获取第二个数字(在本例中为 2),而无需先将其转换为字符串。那可能吗?
我有一个分配给变量的数字,如下所示:
var myVar = 1234;
现在我想从该数字中获取第二个数字(在本例中为 2),而无需先将其转换为字符串。那可能吗?
所以你想从一个数字的十进制书写中得到第二个数字。
最简单和最合乎逻辑的解决方案是将其转换为字符串:
var digit = (''+myVar)[1];
或者
var digit = myVar.toString()[1];
如果您不想以简单的方式进行操作,或者您想要更有效的解决方案,您可以这样做:
var l = Math.pow(10, Math.floor(Math.log(myVar)/Math.log(10))-1);
var b = Math.floor(myVar/l);
var digit = b-Math.floor(b/10)*10;
对于对表演感兴趣的人,我做了一个jsperf。对于像我一样使用日志的随机数是迄今为止最快的解决方案。
从右数第一个数字 → number % 10
=Math.floor((number / 1) % 10)
1234 % 10; // 4
Math.floor((1234 / 1) % 10); // 4
右起第 2 位数字 →Math.floor((number / 10) % 10)
Math.floor((1234 / 10) % 10); // 3
右起第 3 位数字 →Math.floor((number / 100) % 10)
Math.floor((1234 / 100) % 10); // 2
从右数第 n 位 →Math.floor((number / 10^n-1) % 10)
function getDigit(number, n) {
return Math.floor((number / Math.pow(10, n - 1)) % 10);
}
数字中的位数→Math.max(Math.floor(Math.log10(Math.abs(number))), 0) + 1
归功于:https ://stackoverflow.com/a/28203456/6917157
function getDigitCount(number) {
return Math.max(Math.floor(Math.log10(Math.abs(number))), 0) + 1;
}
从左或右开始的第 n 个数字
function getDigit(number, n, fromLeft) {
const location = fromLeft ? getDigitCount(number) + 1 - n : n;
return Math.floor((number / Math.pow(10, location - 1)) % 10);
}
通过将数字除以 10 直到数字小于 100,在循环中去除尾随数字。然后用 10 取模得到第二个数字。
if (x > 9) {
while (x > 99) {
x = (x / 10) | 0; // Use bitwise '|' operator to force integer result.
}
secondDigit = x % 10;
}
else {
// Handle the cases where x has only one digit.
}
“数字”是一回事。
该数字的表示(例如,base-10 字符串“1234”)是另一回事。
如果您想要十进制字符串中的特定数字......那么最好的选择是从字符串中获取它:)
问:您知道 Javascript 中的整数运算存在缺陷,对吗?
问:为什么不使用字符串如此重要?这是家庭作业吗?面试题?
function getNthDigit(val, n){
//Remove all digits larger than nth
var modVal = val % Math.pow(10,n);
//Remove all digits less than nth
return Math.floor(modVal / Math.pow(10,n-1));
}
// tests
[
0,
1,
123,
123456789,
0.1,
0.001
].map(v =>
console.log([
getNthDigit(v, 1),
getNthDigit(v, 2),
getNthDigit(v, 3)
]
)
);
你知道,我知道这个问题问的是如何在没有数字的情况下做到这一点,但标题是“JavaScript:从数字中获取第二个数字?” 意味着很多人在寻找获取特定数字、句号的方法时会找到这个答案。
我不是在抨击最初的提问者,我确信他/她有他们的理由,但从搜索实用性的角度来看,我认为值得在这里添加一个答案,将数字转换为字符串并返回,因为,如果没有别的,这是一种更简洁、更容易理解的方式。
let digit = Number((n).toString().split('').slice(1,1))
// e.g.
let digit = Number((1234).toString().split('').slice(1,1)) // outputs 2
在没有字符串转换的情况下获得数字很棒,但是当您尝试编写清晰简洁的代码时,其他人和未来您可以快速且完全理解,我认为快速字符串转换单行是一种更好的方法正在做。
这就是我对递归的处理方式
function getDigits(n, arr=[]) {
arr.push(n % 10)
if (n < 10) {
return arr.reverse()
}
return getDigits(Math.floor(n/10),arr)
}
const arr = getDigits(myVar)
console.log(arr[2])
我不知道你为什么需要这个逻辑,但下面的逻辑会给你第二个数字
<script type="text/javascript">
var myVal = 58445456;
var var1 = new Number(myVal.toPrecision(1));
var var2 = new Number(myVal.toPrecision(2));
var rem;
rem = var1 - var2;
var multi = 0.1;
var oldvalue;
while (rem > 10) {
oldvalue = rem;
rem = rem * multi;
rem = rem.toFixed();
}
alert(10-rem);
</script>
function getDigit(number, indexFromRight) {
var maxNumber = 9
for (var i = 0; i < indexFromRight - 2; i++) {
maxNumber = maxNumber * 10 + 9
}
if (number > maxNumber) {
number = number / Math.pow(10, indexFromRight - 1) | 0
return number % 10
} else
return 0
}
从一个数字作为字符串或整数取回任何宪章只是一个简单的想法:
const myVar = 1234;
String(myVar).charAt(1)
//"2"
parseInt(String(myVar).charAt(1))
//2
你可以使用这个函数 index = 0 会给你右边的第一个数字(那些) index = 1 会给你右边的第二个数字(十位)
等等
const getDigit = (num, index) => {
if(index === 0) {
return num % 10;
}
let result = undefined;
for(let i = 1; i <= index; i++) {
num -= num % 10;
num /= 10;
result = num % 10;
}
return result;
}
例如:
getDigit(125, 0) // returns 5
gitDigit(125, 1) // returns 2
gitDigit(125, 2) // returns 1
gitDigit(125, 3) // returns 0
var newVar = myVar;
while (newVar > 100) {
newVar /= 10;
}
if (newVar > 0 && newVar < 10) {
newVar = newVar;
}
else if (newVar >= 10 && newVar < 20) {
newVar -= 10;
}
else if (newVar >= 20 && newVar < 30) {
newVar -= 20;
}
else if (newVar >= 30 && newVar < 40) {
newVar -= 30;
}
else if (newVar >= 40 && newVar < 50) {
newVar -= 40;
}
else if (newVar >= 50 && newVar < 60) {
newVar -= 50;
}
else if (newVar >= 60 && newVar < 70) {
newVar -= 60;
}
else if (newVar >= 70 && newVar < 80) {
newVar -= 70;
}
else if (newVar >= 80 && newVar < 90) {
newVar -= 80;
}
else if (newVar >= 90 && newVar < 100) {
newVar -= 90;
}
else {
newVar = 0;
}
var secondDigit = Math.floor(newVar);
我就是这样做的:)
这是一个 JSFiddle 显示它的工作原理:) http://jsfiddle.net/Cuytd/
这也假设您的原始数字始终大于 9……如果它不总是大于 9,那么我想您不会问这个问题;)