Float için PHP Dizesi


120

PHP'ye hiç aşina değilim ve hızlı bir sorum var.

2 değişkenim var pricePerUnitve InvoicedUnits. İşte bunları değerlere ayarlayan kod:

$InvoicedUnits = ((string) $InvoiceLineItem->InvoicedUnits);
$pricePerUnit = ((string) $InvoiceLineItem->PricePerUnit);

Bunu çıkarırsam doğru değerleri alırım. 5000Faturalı birimler ve 1.00fiyat için diyelim .

Şimdi, harcanan toplam tutarı göstermem gerekiyor. Bu ikisini birlikte çarptığımda işe yaramıyor (beklendiği gibi bunlar dizelerdir).

Ama PHP'de değişkenlerin nasıl ayrıştırılacağı / dönüştürüleceği / dönüştürüleceği konusunda hiçbir fikrim yok.

Ne yapmalıyım?

Yanıtlar:


202
$rootbeer = (float) $InvoicedUnits;

Senin için yapmalı. Check out Type-Dönüşümü . Ayrıca Sayılara Dize dönüşümünü de okumalısınız .


Bu en basit yöntem .. ama bazen bunu belirli veritabanı yapılandırmaları ve VARCHAR>11uzunluğu ile yaparken sorunlarla karşılaştım .. henüz tam olarak nedenini daraltamadım.
Talvi Watia

2
^ (float) ilk

Ayrıca, "11,000.00" değerinin beklenen 11000.00 yerine 11 çıktı vereceğini unutmayın
CodeJunkie

65

Yerel ayar farkında olmayan floatvalişlevi istiyorsunuz :

float floatval (mixed $ var) - Bir dizenin float değerini döndürür.

Misal:

$string = '122.34343The';
$float  = floatval($string);
echo $float; // 122.34343

4
yerel farkındalıktan bahsettiği için tebrikler. Farklı yerel ayarların neden (float)olduğu ve ilk sunucunun "" "ve ikincisinde", "olarak dönüştürülmesine neden olan bir sorunu bulmak için 1,5 saat harcadım
Dr. Gianluigi Zane Zanettini

23

Eğer kullanıcı 1,00,000 yazarsa floatvar hata gösterecektir. Yani -

floatval(preg_replace("/[^-0-9\.]/","",$input));

Bu çok daha güvenilirdir.

Kullanım:

$input = '1,03,24,23,434,500.6798633 this';
echo floatval(preg_replace("/[^-0-9\.]/","",$input));

7
Yerine ereg kullanımı Süleyman Demirel $string=preg_replace("/[^0-9\.\-]/","",$string);
ontananza

4
Evet, ereg, Bu işlev KULLANIMDAN KALDIRILMIŞTIR. Öyleyse ereg yerine preg kullanmanız gerekiyor :)
HADI

9

Float'larda işaretleme ile uğraşmak önemsiz olmayan bir görevdir. İngilizce / Amerikan gösteriminde bin artı biçimlendirirsiniz 46*10-2:

1,000.46

Ancak Almanya'da virgül ve nokta değiştirirsiniz:

1.000,46


Bu, çok dilli uygulamalarda doğru sayıyı tahmin etmeyi gerçekten zorlaştırır. Bu görev için Zend Framework
kullanılmasını şiddetle tavsiye ediyorum Zend_Measure. Bu bileşen, dizeyi kullanıcı diline göre bir kayan nokta olarak ayrıştırır.


3
Günümüzde (+3 yıl), NumberFormatter PHP 5.3'ten itibaren intluzantı ile kullanılabilir.
zamnuts

1
Soruyu cevapladığımda PHP 5.3 kullanılıyordu, ancak yorumunuza kadar bu tek işlevin farkında değildim çünkü benzer şeyler yapan düzinelerce kitaplık var. Ancak, uluslararası uzantının sahip olduğu kadar iyi bir yerel kapsama alanına sahip olmayacaklar. Teşekkürler, hatırlamaya çalışacağım.
Tobias P.

1

Herhangi bir metin stilinden bir kayan değer atamak için bu işlevi kullanın:

function parseFloat($value) {
    return floatval(preg_replace('#^([-]*[0-9\.,\' ]+?)((\.|,){1}([0-9-]{1,3}))*$#e', "str_replace(array('.', ',', \"'\", ' '), '', '\\1') . '.\\4'", $value));
}

Bu çözüm herhangi bir yerel ayara bağlı değildir. Böylece, kullanıcı girdisi için kullanıcılar istedikleri şekilde float değerleri yazabilirler. Bu, örneğin yalnızca İngilizce olan bir projeniz olduğunda, ancak dünyanın her yerinden insanlar onu kullandığında ve projenin kayan değerler için virgül yerine nokta istediğini akıllarında tutmadıklarında gerçekten yararlıdır. Javascript'i karışıma atabilir ve tarayıcının varsayılan ayarlarını getirebilirsiniz, ancak yine de birçok kişi bu değerleri İngilizceye ayarlayabilir ancak yine de 1,25 yerine 1,25 yazabilirsiniz (özellikle çeviri endüstrisi, araştırma ve BT ile sınırlı olmamak üzere)


bunun neden kötü olduğu / nerede başarısız olduğu hakkında herhangi bir yorum var mı?
Hafenkranich

veya daha hızlı olan benzer şekilde esnek bir yol var mı?
Hafenkranich

1
"Artık desteklenmeyen" e bayrağını kullanır. Benim tahminim bu.
Leif

0

Bunu yapmanın standart yolu ile ilgili bir sorunla karşılaşıyordum:

$string = "one";

$float = (float)$string;

echo $float; : ( Prints 0 )

Geçerli bir sayı yoksa, ayrıştırıcı bir sayı döndürmemeli, bir hata vermelidir. (Bu, kodumda yakalamaya çalıştığım bir durum, YMMV)

Bunu düzeltmek için aşağıdakileri yaptım:

$string = "one";

$float = is_numeric($string) ? (float)$string : null;

echo $float; : ( Prints nothing )

Ardından, dönüştürmeyi daha fazla işlemeden önce, dizenin geçerli bir ayrıştırılması yoksa bir hata kontrol edip döndürebilirim.


0

Ayrı olarak dönüştürülemeyen değerleri işlemeniz gerekiyorsa, bu yöntemi kullanabilirsiniz:

try {
    $valueToUse = trim($stringThatMightBeNumeric) + 0;
} catch (\Throwable $th) {
    // bail here if you need to
}

0

PHP'de bir dizeyi / sayıyı sayı / float / ondalık sayıya dönüştürme hakkında daha fazla bilgi için bu bağlantıyı takip edebilirsiniz . BURADA BU BAĞLANTI DİYOR ...

Yöntem 1: number_format () İşlevini kullanma. Number_format () işlevi bir dizeyi sayıya dönüştürmek için kullanılır. Başarı durumunda biçimlendirilmiş sayıyı döndürür, aksi takdirde başarısızlık halinde E_WARNING verir.

$num = "1000.314"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num), "\n"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num, 2); 

Yöntem 2: Tür çevrimini kullanma: Typecasting, bir dizeyi doğrudan kayan, çift veya tamsayı ilkel türe dönüştürebilir. Bu, bir dizeyi herhangi bir işlev olmadan sayıya dönüştürmenin en iyi yoludur.

// Number in string format 
$num = "1000.314"; 

// Type cast using int 
echo (int)$num, "\n"; 

// Type cast using float 
echo (float)$num, "\n"; 

// Type cast using double 
echo (double)$num; 

Yöntem 3: intval () ve floatval () İşlevini kullanma. İntval () ve floatval () işlevleri, dizeyi sırasıyla karşılık gelen tamsayı ve float değerlerine dönüştürmek için de kullanılabilir.

// Number in string format 
$num = "1000.314"; 

// intval() function to convert  
// string into integer 
echo intval($num), "\n"; 

// floatval() function to convert 
// string to float 
echo floatval($num); 

Yöntem 4: 0 ekleyerek veya matematiksel işlemler gerçekleştirerek. Dize numarası, dize ile 0 eklenerek bir tam sayıya veya kayan sayıya da dönüştürülebilir. PHP'de matematiksel işlemler gerçekleştirerek, dizge bir tam sayıya dönüştürülür veya örtük olarak yüzer.

// Number into string format 
$num = "1000.314"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.1;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.