Перетворення рядків і чисел у JavaScript


89

Як я можу зробити наступне в JavaScript?

  1. Об'єднати "1", "2", "3" у "123"

  2. Перетворити "123" у 123

  3. Додайте 123 + 100 = 223

  4. Приховати 223 на "223"


42
Майже всі книги, які я прочитав, займаються цими проблемами. Але це нормально. Відповіді на питання - це те, що таке StackOverflow. @Shadi Almosri - ТО має правило "не бути злим". Я не бачу сенсу принижувати людей, які тут задають питання, оскільки це суть місця.
Nosredna

4
@Nosredna: Я цілком розумію задавання питань, я люблю не що інше, як відповідати на них, але я думаю, що те, що ти спробував, є кращим етикетом, ніж просто очікуванням відповіді, а також кращим для особистого досвіду навчання. Тільки моя думка, не намагаючись бути злими! :)
Шаді Алмосрі,

1
@Shadi, так як слід було задати питання? З декларацією, що вже шукали відповідь?
Nosredna

1
Коли це я вперше побачив, це здалося мені якось домашньою роботою, але коли я її перечитав, то думав, що ні, здавалося, хтось експериментує в JavaScript і отримує несподівані результати і хоче забити його. Тим не менше, мені цікаво, чи може stackoverflow.com/faq містити щось на зразок кодексу честі для студентів. Ми тут є свого роду глобальним університетом, і я не вважаю божевільним намагатися з’ясувати, який набір етики може бути для цього місця. А може, це божевілля. :-)
artlung

6
@Shadi, добре, позитивним є те, що питання та відповідь знаходяться в StackOverflow, і, сподіваюся, допоможуть іншим людям. Я бачу, що люди весь час застрягають у цьому, особливо коли походять з таких мов, як Java. Є причина, чому люди запитують це знову і знову - це тому, що вони ДУМАЮТЬ, що знають, як працюють вирази в JavaScript, але вони цього не роблять. Вони роблять припущення на основі досвіду поза JS. Ось чому так корисно спробувати кілька простих тестів із додаванням рядків і чисел та спробою одинарних плюсів і мінусів.
Носредна

Відповіді:


120

Ви хочете познайомитися з parseInt()і toString().

І корисним у вашому наборі інструментів буде розглянути змінну, щоб з’ясувати, який це тип - typeof:

<script type="text/javascript">
    /**
     * print out the value and the type of the variable passed in
     */

    function printWithType(val) {
        document.write('<pre>');
        document.write(val);
        document.write(' ');
        document.writeln(typeof val);
        document.write('</pre>');
    }

    var a = "1", b = "2", c = "3", result;

    // Step (1) Concatenate "1", "2", "3" into "123"
    // - concatenation operator is just "+", as long
    //   as all the items are strings, this works
    result = a + b + c;
    printWithType(result); //123 string

    // - If they were not strings you could do
    result = a.toString() + b.toString() + c.toString();
    printWithType(result); // 123 string

    // Step (2) Convert "123" into 123
    result = parseInt(result,10);
    printWithType(result); // 123 number

    // Step (3) Add 123 + 100 = 223
    result = result + 100;
    printWithType(result); // 223 number

    // Step (4) Convert 223 into "223"
    result = result.toString(); //
    printWithType(result); // 223 string

    // If you concatenate a number with a 
    // blank string, you get a string    
    result = result + "";
    printWithType(result); //223 string
</script>

Якась особлива причина, по якій ви поміщаєте це в теги сценарію?
Джулікс

@Julix Для новачків у 2009 році, вдавшись до HTML-файлу, щоб вивчити базову концепцію. Якби я сьогодні відповідав на це свіже, я міг би зробити це по-іншому, але, можливо, ні.
artlung

53

Крок (1) Об’єднайте "1", "2", "3" у "123"

 "1" + "2" + "3"

або

 ["1", "2", "3"].join("")

Метод join об'єднує елементи масиву у рядок, ставлячи вказаний роздільник між елементами. У цьому випадку "роздільник" - це порожній рядок ( "").


Крок (2) Перетворіть "123" у 123

 parseInt("123")

До ECMAScript 5 потрібно було передати радікс для бази 10:parseInt("123", 10)


Крок (3) Додайте 123 + 100 = 223

 123 + 100


Крок (4) Прикрийте 223 у "223"

 (223).toString() 


Покладіть все разом

 (parseInt("1" + "2" + "3") + 100).toString()

або

 (parseInt(["1", "2", "3"].join("")) + 100).toString()

4
Гарний, наочний приклад. Крім того, похвала за добру форму - ви завжди повинні вказувати радіус для parseIntфункції .
hotshot309

Включаючи radix мене бентежило, і я перейшов до іншої відповіді, де це було пояснено. Відредаговано в короткому поясненні, щоб бути прямо на місці плутанини.
ArtOfWarfare

@ArtOfWarfare Дякую, хороша редакція. Радікс був необхідний під час цієї відповіді. У ці дні я можу навести аргумент, щоб його залишити поза увагою. Починаючи з ES5, який підтримують усі «сучасні» браузери та Node.js, parseInt (<a рядок лише з 0-9>) завжди використовує базу 10.
Patrick McElhaney

цікавий факт .. в оригінальному JavaScript Netscape (близько 1995 р.) за замовчуванням для parseInt було 8 (якщо рядок не містив 8 або 9)
Джастін Омс,

27
r = ("1"+"2"+"3")           // step1 | build string ==> "123"
r = +r                      // step2 | to number    ==> 123
r = r+100                   // step3 | +100         ==> 223
r = ""+r                    // step4 | to string    ==> "223"

//in one line
r = ""+(+("1"+"2"+"3")+100);

Дякую за швидкий рядок -> перетворення числа
mcont

Якщо ви перевіряєте, це число чи ні, використовуйте parseInt (). Наприклад, parseInt ("") - NaN, але + "" - 0!
greene

15

Ці питання постійно виникають завдяки системі набору тексту на JavaScript. Люди думають, що отримують число, коли отримують рядок числа.

Ось деякі речі, які ви можете побачити, щоб скористатися перевагами способу обробки JavaScript із рядками та числами. Особисто мені б хотілося, щоб JavaScript використовував якийсь символ, відмінний від + для конкатенації рядків.

Крок (1) Об’єднайте "1", "2", "3" у "123"

result = "1" + "2" + "3";

Крок (2) Перетворіть "123" у 123

result = +"123";

Крок (3) Додайте 123 + 100 = 223

result = 123 + 100;

Крок (4) Перетворіть 223 на "223"

result = "" + 223;

Якщо ви знаєте, ЧОМУ це працює, ви з меншою ймовірністю зіткнетесь із проблемами з виразами JavaScript.


3
Я насправді вважаю, що це надзвичайно погана практика, оскільки вона досить непрозора щодо того, що відбувається. Знання того, що певні операції впливають на неявний акторський трюк, це добре, і це добре знати, але це зовсім не читається. Спілкування - це все.
annakata

1
Я думаю, важливо знати ці речі ТОЧНО, щоб ви знали, що відбувається, коли читаєте код. Багато JavaScript є стислим, оскільки він передається як джерело, а невеликий код може означати зменшення вартості сервера.
Nosredna

6
Ви повинні досягти цього за допомогою інструментів стиснення, однак у цій формі це оптимізація за цілком реальною вартістю обслуговування.
annakata

6
Тим не менше, знання цих речей допомогло б запобігти виникненню запитань, що полягало у відсутності знань про те, як JavaScript має справу із рядками та числами. Це питання інтелектуальної цікавості. Що відбувається, коли я додаю число до рядка? Як працює унарний плюс? Якщо ви не знаєте відповідей, ви насправді не знаєте JavaScript, і такі запитання з’являться.
Носредна

11

Ви можете зробити це так:

// step 1 
var one = "1" + "2" + "3"; // string value "123"

// step 2
var two = parseInt(one); // integer value 123

// step 3
var three = 123 + 100; // integer value 223

// step 4
var four = three.toString(); // string value "223"

16
Найкращою практикою було б додати параметр radix до функції parseInt (). отже, parseInt (one, 10) запевняє, що все, на що ви кинете, не буде неправильно перетворено.
artlung

3
Домовились. В іншому випадку значення, що починаються з, 0будуть сприйматися як вісімкові (базові-8) числа.
hotshot309

1
Ще більш несподіваним є те, що значення, що починаються з, 0а потім містять 8або 9будуть невдалими, призводять до повернення 0. Наприклад,, parseInt('034') = 28і parseInt('09') = 0.
Роберт Мартін,

9

Щоб перетворити рядок у число, відніміть 0. Щоб перетворити число в рядок, додайте "" (порожній рядок).

5 + 1 дасть вам 6

(5 + "") + 1 дасть вам "51"

("5" - 0) + 1 дасть вам 6


1
Покладання на хитрощі, засновані на подібних мовних химерностях, може призвести до справжньої неясності. наприклад, "5" -0 дійсно призводить до числа 5, але "5" +0 призводить до рядка "50". (Так, я знаю, що минуло багато років, і, мабуть, трохи сумно, що я навіть читав це.)
Нік Райс,

6

parseInt неправильно описаний як scanf:

parseInt ("12 мавп", 10) - це число зі значенням '12'
+ "12 мавп" - це число зі значенням 'NaN'
Число ("12 мавп") - це число зі значенням 'NaN'


1

Нижче наведено дуже дратуючий приклад того, як JavaScript може завадити вам проблеми:

Якщо ви просто спробуєте використати parseInt() для перетворення в число, а потім додати інше число до результату, це об’єднає два рядки.

Однак ви можете вирішити проблему, розмістивши вираз суми в дужках, як показано в прикладі нижче.

Результат: Їхня вікова сума: 98; Їх вікова сума НЕ: 5048

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
function Person(first, last, age, eye) {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.eyeColor = eye;
}

var myFather = new Person("John", "Doe", "50", "blue");
var myMother = new Person("Sally", "Rally", 48, "green");

document.getElementById("demo").innerHTML = "Their age sum is: "+
 (parseInt(myFather.age)+myMother.age)+"; Their age sum is NOT: " +
 parseInt(myFather.age)+myMother.age; 
</script>

</body>
</html>


0

Найпростіший - це коли ви хочете зробити ціле число рядком

var a,b, c;
a = 1;
b = a.toString(); // This will give you string

Тепер із змінної b, яка має тип string, ми можемо отримати ціле число

c = b *1; //This will give you integer value of number :-)

Якщо ви хочете перевірити вище, це номер. Якщо ви не впевнені, що b містить ціле число, ви можете використовувати

if(isNaN(c*1)) {
  //NOt a number
}
else //number

0

Ми можемо зробити це, використовуючи одинарний оператор плюс, щоб спочатку перевести їх у числа і просто додати. Дивіться нижче:-

var a = "4";
var b = "7";
var sum = +a + +b; 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.