Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   вывод числа со знаком (https://javascript.ru/forum/misc/36029-vyvod-chisla-so-znakom.html)

LLIyRiK911 01.03.2013 17:18

вывод числа со знаком
 
Как вывести число с его знаком, например что бы 5 вывело как +5

dmitriymar 01.03.2013 17:24

var i=5;
alert("+"+5);

Demath 01.03.2013 17:26

LLIyRiK911,

Сделать строкой, типа num1 = '+'+num.

Конкретней напишите, где каких целей нужно.

LLIyRiK911 01.03.2013 18:02

есть уравнение k*x+b*y......+c*z мне его надо вывести со знакоми, но не плюсуя "+", а типо alert( k + "*x" + b + "*y" +..... + c + "*z") для отрицательный значиний минус сам ставится, а вот для положительных как?

Demath 01.03.2013 18:07

Всё равно мало дали информации.

Какие значения могут принимать коэффициенты? Нулю могут быть равны?

Если на выходе первый коэффициент (k) будет с '+' (т.е. '+k'), ничего страшного?

LLIyRiK911 01.03.2013 18:15

Коэффициенты могут быть любые, если на выходе первый коэффициент (k) будет с '+' (т.е. '+k') ничего страшного, просто если было метод форматирования числа, который выводит знак этого числа было бы очень хорошо)) а так мне приходиться делать так
if (b>=0 && m>=0){
       alert("Уравнения прямой: " + a + "*x+" + b + "*y+" + m + "=0"); 
    }
    else if (b<0 && m>=0 ){
       alert("Уравнения прямой: " + a + "*x"  + b + "*y+" + m + "=0"); 
    }
    else if (b>=0 && m<0){
        alert("Уравнения прямой: " + a + "*x+"  + b + "*y" + m + "=0");
    }
    else {
         alert("Уравнения прямой: " + a + "*x"  + b + "*y" + m + "=0");

LLIyRiK911 01.03.2013 18:24

На с++ есть флаг +, который обязательно перед числом указывает знак плюс (+) или минус (—), мне бы что нибудь такое только на скрипте

rgl 01.03.2013 18:54

var a=1, b=-2, m=-3;
alert( ("Уравнения прямой: " + a + "*x+" + b + "*y+" + m + "=0").replace( /\+-/g, '-' ) );

Demath 01.03.2013 18:57

Несложно определить знаки

function LineEq(an)
{
    for (var i=0; i<an.length; i++)
        { if (an[i]<0) { an[i] = ''+an[i] }
          else         { an[i] = '+'+an[i] }
        }
    return (an[0]+'*x'+an[1]+'*y'+an[2]+'=0');
}
 alert( LineEq([2,-1,4]) );


Но, если уравнение в таком виде должно показываться пользователю, то, думаю, лучше преобразовать к нормальному (привычному) виду.

rgl 01.03.2013 18:57

Или даже
var a=1, b=-2, m=-3;
alert( "Уравнения прямой: " + a + ("*x+" + b + "*y+" + m + "=0").replace( /\+-/g, '-' ) );

Demath 01.03.2013 19:05

rgl, как бы не принято писать 1 перед неизвестными. Также о нулевых коэффициентах нужно позаботиться.

Но, естественно, вопрос не к Вам, а к ТС.

rgl 01.03.2013 19:07

function toPlusStr( n )
{
  n += "";
  return n.charAt(0) == "-" ? n : "+" + n;
}

var a=1, b=-2, m=-3;

alert("Уравнения прямой: " + a + "*x" + toPlusStr(b) + "*y" + toPlusStr(m) + "=0");

Demath 01.03.2013 19:09

rgl, не понял, чем отличается результат от предыдущего?

rgl 01.03.2013 19:15

Цитата:

Сообщение от Demath (Сообщение 238204)
как бы не принято писать 1 перед неизвестными. Также о нулевых коэффициентах нужно позаботиться.

Если "вылизывать" код, то в полученном варианте новичку сложнее будет найти ответ на свой вопрос (а не новичок такого вопроса бы не задал).

rgl 01.03.2013 19:16

Цитата:

Сообщение от Demath (Сообщение 238206)
rgl, не понял, чем отличается результат от предыдущего?

Тем, что строчка "Уравнения прямой: " не обрабатывается понапрасну регэкспом.

LLIyRiK911 01.03.2013 19:19

Цитата:

Сообщение от rgl (Сообщение 238202)
Или даже
var a=1, b=-2, m=-3;
alert( "Уравнения прямой: " + a + ("*x+" + b + "*y+" + m + "=0").replace( /\+-/g, '-' ) );

Спасибо

Demath 01.03.2013 19:38

Цитата:

Сообщение от rgl
Тем, что строчка "Уравнения прямой: " не обрабатывается понапрасну регэкспом.

Теперь понял.

Цитата:

Сообщение от rgl
Если "вылизывать" код, то в полученном варианте новичку сложнее будет найти ответ на свой вопрос (а не новичок такого вопроса бы не задал).

Просто я делал очень похожее для своих нужд. Поэтому спросил.

Нужна была функция для упрощения (преобразования к привычному виду) уравнений любого порядка.
Получилось так:

<script type="text/javascript">
function simplifyEq(an,xn)
{  var axn = [], sign;

   xn[an.length-1] = '';

  for (i=0; i<an.length; i++)
        { if (an[i]<0) {sign = ''}
          else         {sign = '+'}
          
          if (an[i]==-1)     {axn[i]='-'+xn[i]; axn[an.length-1]='-1'}
          else if (an[i]==0) {axn[i]=''}
          else if (an[i]==1) {axn[i]='+'+xn[i]; axn[an.length-1]='+1'}
          else               {axn[i]=sign+an[i]+xn[i]}  
        }

  var newEq = axn.join('');

  if (/\+/.test(newEq.charAt(0)))         //Если перед самым 1-м коэф. будет '+', то удаляем этот '+'
     { newEq = newEq.replace(/\+/,'') }

  if (/-/.test(newEq.charAt(0)))              
     { newEq = newEq.replace(/-/,'').replace(/(-|\+)/g,'$1+').replace(/-\+/g,'+').replace(/\+\+/g,'-') }
                                          //Если перед самым 1-м коэф. будет '-', то удаляем этот '-'
                                          //и изменяем остальные знаки на противоположные

  return newEq+'=0';
}
</script>
<button onclick="alert( '-2x^2+1y^2-1xy+0x+5y-4=0\n<=>\n'
                        + simplifyEq([-2,1,-1,0,5,-4],['x^2','y^2','xy','x','y'])
                       )">
Преобразовать <b>-2x^2+1y^2-1xy+0x+5y-4=0</b> к привычному виду</button>

rgl 02.03.2013 19:14

Demath,
Почитал. Зачем нужны зачеркнутые части?

if (an[i]==-1) {axn[i]='-'+xn[i]; axn[an.length-1]='-1'}
else if (an[i]==0) {axn[i]=''}
else if (an[i]==1) {axn[i]='+'+xn[i]; axn[an.length-1]='+1'}
else {axn[i]=sign+an[i]+xn[i]}


Зачем проверять и заменять регэкспом в таком простом случае?
if (/\+/.test(newEq.charAt(0))) //Если перед самым 1-м коэф. будет '+', то удаляем этот '+'
{ newEq = newEq.replace(/\+/,'') }

Почему не:
if ( newEq.charAt(0) == '+' ) newEq = newEq.slice(1)



if (/-/.test(newEq.charAt(0)))
{ newEq = newEq.replace(/-/,'').replace(/(-|\+)/g,'$1+').replace(/-\+/g,'+').replace(/\+\+/g,'-') }
//Если перед самым 1-м коэф. будет '-', то удаляем этот '-'
//и изменяем остальные знаки на противоположные

Аналогично первый минус можно удалить слайсом, а остальные знаки инвертировать одним вызовом replace, которому передать функцию, возвращающую плюс или минус в зависимости от...

Demath 02.03.2013 19:53

Цитата:

Сообщение от rgl
Почитал. Зачем нужны зачеркнутые части?

if (an[i]==-1) {axn[i]='-'+xn[i]; axn[an.length-1]='-1'}
else if (an[i]==0) {axn[i]=''}
else if (an[i]==1) {axn[i]='+'+xn[i]; axn[an.length-1]='+1'}
else {axn[i]=sign+an[i]+xn[i]}

Это для свободного члена уравнения. Так как он не имеет неизвестной, то и обрабатываю его отдельно.
Мне показалось, что так проще всего его учесть.

Цитата:

Сообщение от rgl
Зачем проверять и заменять регэкспом в таком простом случае?
if (/\+/.test(newEq.charAt(0))) //Если перед самым 1-м коэф. будет '+', то удаляем этот '+'
{ newEq = newEq.replace(/\+/,'') }

Почему не:
if ( newEq.charAt(0) == '+' ) newEq = newEq.slice(1)

Мало знаний и опыта работы с готовыми методами, поэтому так получается.


Цитата:

Сообщение от rgl
Аналогично первый минус можно удалить слайсом, а остальные знаки инвертировать одним вызовом replace, которому передать функцию, возвращающую плюс или минус в зависимости от...

Спасибо, понял!


P.S. А где почитать продвинутое использование циклов в JavaScript?
То есть интересуют "чистые" алгоритмы с минимальным использованием готовых методов.


Часовой пояс GMT +3, время: 04:58.