51

我有一个分配给变量的数字,如下所示:

var myVar = 1234;

现在我想从该数字中获取第二个数字(在本例中为 2),而无需先将其转换为字符串。那可能吗?

4

12 回答 12

91

所以你想从一个数字的十进制书写中得到第二个数字。

最简单和最合乎逻辑的解决方案是将其转换为字符串:

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。对于像我一样使用日志的随机数是迄今为止最快的解决方案。

于 2012-12-19T15:33:31.770 回答
39

从右数第一个数字 → 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);
}
于 2017-01-18T05:48:17.980 回答
4

通过将数字除以 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.
}
于 2012-12-19T15:33:30.070 回答
4

“数字”是一回事。

该数字的表示(例如,base-10 字符串“1234”)是另一回事。

如果您想要十进制字符串中的特定数字......那么最好的选择是从字符串中获取它:)

问:您知道 Javascript 中的整数运算存在缺陷,对吗?

问:为什么不使用字符串如此重要?这是家庭作业吗?面试题?

于 2012-12-19T15:34:24.533 回答
3

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)
    ]
  ) 
);

于 2016-09-08T06:37:19.270 回答
3

你知道,我知道这个问题问的是如何在没有数字的情况下做到这一点,但标题是“JavaScript:从数字中获取第二个数字?” 意味着很多人在寻找获取特定数字、句号的方法时会找到这个答案。

我不是在抨击最初的提问者,我确信他/她有他们的理由,但从搜索实用性的角度来看,我认为值得在这里添加一个答案,将数字转换为字符串并返回,因为,如果没有别的,这是一种更简洁、更容易理解的方式。

let digit = Number((n).toString().split('').slice(1,1))

// e.g.
let digit = Number((1234).toString().split('').slice(1,1)) // outputs 2

在没有字符串转换的情况下获得数字很棒,但是当您尝试编写清晰简洁的代码时,其他人和未来您可以快速且完全理解,我认为快速字符串转换单行是一种更好的方法正在做。

于 2017-01-06T01:43:08.290 回答
3

这就是我对递归的处理方式

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])
于 2021-01-14T18:22:54.987 回答
0

我不知道你为什么需要这个逻辑,但下面的逻辑会给你第二个数字

<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>
于 2012-12-19T16:13:31.043 回答
0

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
        }

于 2016-09-01T11:57:55.380 回答
0

从一个数字作为字符串或整数取回任何宪章只是一个简单的想法:

const myVar = 1234;
String(myVar).charAt(1)
//"2"
parseInt(String(myVar).charAt(1))
//2
于 2018-10-11T16:51:49.290 回答
0

你可以使用这个函数 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
于 2021-11-07T20:41:59.067 回答
-4
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,那么我想您不会问这个问题;)

于 2012-12-19T15:46:02.087 回答