2013-08-16 4 views
0

Это тривиальная операция, но она выявила некоторые сложные точки. У меня есть строка в PHP, скажем '234.00'. Я хочу преобразовать это в отрицательное число и желательно получить строку в конце. Поэтому тестовые примеры должны бытьОбратный знак числа, хранящегося в виде строки

'234.00' ==> '-234.00' 
'-234.00' ==> '234.00' 
'0.00' ==> '0.00' 

Исходный код был

$signReversed = $stringNumber * -1.0 

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

$signReversed = strval($stringNumber * -1.0) 

, но это не будет работать на последнем тесте, потому что я получаю '-0' - отрицательный нуль в виде строки.

Предложения по наилучшему способу сделать это?

+0

$ number = "-". $ Число; используйте это, и он всегда будет строкой, не нужно ничего конвертировать. просто добавьте 1, если ($ number == "-0") $ number = "0" ;. положите его в функцию – Elpy

+0

Это не работает для -234.00. – matt

+0

Бу отрицательный голос без комментариев. Кажется, слишком просто или тривиально, наверное? Вопрос по-прежнему кажется мне разумным, и я получил несколько неправильных ответов, поэтому он не мертв просто. – matt

ответ

1

Что об этом

должны работать для небольших чисел, большие числа и строки могут содержать нулевые байты

function flipSign($stringNummer) { 
    if ((string)$stringNummer !== $stringNummer) // fast !is_string check 
     throw new Exception('input should be a string'); 
    return number_format($stringNummer * -1, 2, '.', ''); 
} 

/** 
* NULL byte test 
*/ 
var_dump(flipSign("00\0.10")); // string(5) "-0.10" 
var_dump(flipSign("-00\0.10")); // string(4) "0.10" 

var_dump(flipSign("00.10")); // string(5) "-0.10" 
var_dump(flipSign("-00.10")); // string(4) "0.10" 

var_dump(flipSign("234.00")); // string(7) "-234.00 
var_dump(flipSign("-234.00")); // string(6) "234.00" 

var_dump(flipSign("234.20")); // string(7) "-234.20" 
var_dump(flipSign("-234.20")); // string(6) "234.20" 

var_dump(flipSign("100000.20")); // string(10) "-100000.20" 
var_dump(flipSign("-100000.20")); // string(9) "100000.20" 
+0

Отлично, хотя я могу гарантировать, что вход не является строкой, поэтому я могу пропустить эту первую часть. – matt

1

Дайте этому попытку:

$stringVal = "234.00"; 
$negativeStringVal = strval(floatval($stringVal) * -1); 

Я думаю, ваша проблема в том, что PHP пытается преобразовать число в int, но не из-за знаков после запятой.

Edit: PHP Fiddle: http://phpfiddle.org/main/code/iay-rsc

+0

Ваш php-код также разбивается на $ stringVal = "234 \ 0.00"; NULL байт, который завершает строку после 234 .. ive отправил ответ, где он исправил его, также исправляет усеченные нули после «.». –

+0

Сбой при нулевом тесте - возвращает отрицательный ноль. – matt

+0

Почему бы просто не проверить, если число равно нулю, а затем не умножаться в этом случае? – Jake

1

Почему бы просто не использовать унарный оператор отрицания (-)?

$signReversed = "" . (-$stringNumber); 
+0

Это возвращает число, по-видимому, не строку. – matt

+0

Обновлен фрагмент, чтобы преобразовать число в строку. – robbrit

+0

Упрощенный, но я перехожу с ответом 'number_format ...' от Raymond, потому что он работает над улучшением работы с некоторыми другими тестовыми примерами, которые я забыл поставить в исходном вопросе. – matt

0

что-то вроде этого, возможно

$vals=array('234.00','-234.00','0'); 
$newvals=array(); 
foreach($vals as $val){ 
    $tmpval=$val*-1; 
    array_push($newvals,"$tmpval"); 
} 
var_export($newvals); 
+0

Итак, основная часть вашего ответа - '$ val * -1', что я и имел в начале. Он не работает в случае «0». – matt

0

Попробуйте $signReversed = strval(floatval($stringNumber) * -1.0)

+0

Сбой при нулевом тесте - все равно возвращает отрицательный ноль. – matt

Смежные вопросы