我有一个分配给变量的数字,如:
var myVar = 1234;
现在我希望从该数字中获取第二个数字(在这种情况下为2),而不是先将其转换为字符串。这可能吗?
答案 0 :(得分:69)
所以你想得到一个数字的十进制数字的第二个数字。
最简单和最合乎逻辑的解决方案是将其转换为字符串:
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。对于使用日志的随机数,我所做的是迄今为止最快的解决方案。
答案 1 :(得分:15)
右侧第一位数字→number % 10
= Math.floor((number / 1) % 10)
1234 % 10; // 4
Math.floor((1234 / 1) % 10); // 4
右侧第二位数字→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);
}
答案 2 :(得分:3)
通过将数字除以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.
}
答案 3 :(得分:3)
这就是我将如何处理递归
push -f
答案 4 :(得分:2)
“数字”是一回事。
该号码的表示(例如,基数为10的字符串“1234”)是另一回事。
如果你想要一个十进制字符串中的特定数字...那么你最好的选择是从字符串中获取它:)
问:你知道Javascript中存在使用整数运算的缺陷,对吗? 问:为什么不使用字符串这么重要?这是家庭作业吗?面试问题?答案 5 :(得分:2)
你知道,我得到的问题是如何在没有数字的情况下这样做,但标题为“JavaScript:从数字中获取第二个数字?”意味着很多人在寻找获得特定数字时段的方法时会找到这个答案。
我不是在抨击原问题提问者,我确信他/她有他们的理由,但从搜索实用性的角度来看,我认为值得在这里添加答案,确实将数字转换为字符串并返回,因为,如果不出意外,这是一种更简洁易懂的方式。
let digit = Number((n).toString().split('').slice(1,1))
// e.g.
let digit = Number((1234).toString().split('').slice(1,1)) // outputs 2
获取没有字符串转换的数字是很好的,但是当你尝试编写清晰简洁的代码时,其他人和未来你可以非常快速地完全理解,我认为快速的字符串转换是一个内容是一个更好的方式。
答案 6 :(得分:1)
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)
]
)
);
答案 7 :(得分: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>
答案 8 :(得分: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
}
&#13;
答案 9 :(得分:0)
从数字中以字符串或整数的形式获取任何租船合同只是一个简单的想法:
const myVar = 1234;
String(myVar).charAt(1)
//"2"
parseInt(String(myVar).charAt(1))
//2
答案 10 :(得分:-3)
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那么我想你不会问这个问题;)