2010-03-22 82 views
4

我正在處理一個數據庫,該數據庫有一串以前導0開頭的序列號。使用PHP八進制和字符串轉換

所以序列號可以像00032432或56332432.

問題是用PHP我不明白與八進制轉換系統是如何工作的。

一個具體的例子是,我試圖轉換和比較所有這些基於整數的字符串。

是否有可能將八進制數(例如00234)轉換爲像「00234」這樣的字符串,以便我可以比較它?

編輯 - 添加一個特定的例子。我希望能夠像下面那樣在串行上運行str函數。

$serial = 00032432; // coming from DB 

    if(substr($serial, 0, 1) == '0') { 

     // do something 

    } 
+1

我不明白你的確切問題嗎?值來自一個字符串,所以它不應該被視爲一個八進制,直到你用它做了一些數學運算,比如在一個加法中使用它。你應該能夠在字符串比較中使用它,不用擔心。或者我誤解了一些東西? – 2010-03-22 21:00:39

+0

在使用和比較之前,來自db的值是否分配給變量有什麼關係?因爲我無法像使用數字或沒有前導零的字符串那樣操縱這些變量。 – krx 2010-03-22 21:08:13

回答

4

當你(string) $number轉換,你都是十進制的字符串,如果你寫在八進制數也沒關係模式或十進制模式下,int是一個int,它本身不是一個基數。這是他的字符串表示,必須用基礎來解釋。

,你可以得到這樣一個數字的八進制字符串表示:

$str = base_convert((string) 00032432, 10, 8); 

或給予十進制代表數量:或者,更簡潔但不太清楚

$str = base_convert((string) 13594, 10, 8);  

$str = base_convert(00032432, 10, 8); 
$str = base_convert(13594, 10, 8); 

在最後的字符串轉換是隱含的。這些例子給出了所有結果$ str =「32432」。

base_convert如果您還想在你的字符串中零的數字的字符串表示從基轉換爲另一種

,你可以用簡單的數學添加。

希望這可以幫助你。

+0

如何在運行base_convert之前知道它是否是八進制數?例如,我不想在非八進制上運行base_convert,因爲它會更改值。有沒有辦法檢查運行此功能之前,它會改變值?我只想在前導零的值上運行它。 – krx 2010-03-22 21:58:19

+0

我不明白你的意思。你可以從數據庫中得到字符串格式的數字,我想。然後你有一個字符串,你可以檢查零...但我想我不明白哪個是問題,所以如果你給我更詳細的問題,用一個更詳細的例子... – 2010-03-22 22:08:11

+0

我得到來自DB的字符串並將它們分配給變量。當我嘗試在它們上運行字符串函數時,它們不能處理帶前導零的數字(即00532),但是在沒有前導零(即532)的數字上它可以正常工作。當我只對前導零的數字使用base_convert時,它可以正常工作,但是沒有前導零的數字會被錯誤地轉換。問題是我不知道哪些數字要使用base_convert函數,因爲我不能確定它們是否具有前導零而不先轉換它們。那有意義嗎?我以前從來沒有聽說過八進制數=/ – krx 2010-03-22 22:17:01

0
$serial = 00032432; //here you have an octal number 
$serial= strval($serial); //now you have a string 
if ($serial[0]=="0") { 
//do something 
} 
+0

這不起作用。我在if語句中添加了回顯,但沒有顯示。 strval和其他函數(string)不能與這些八進制數一起使用?感謝您的協助! – krx 2010-03-22 21:09:33

+0

好吧,另一個問題,你如何得到這個變量是一個數字?從數據庫中接收它後,你明確地將它轉換爲(int)嗎?那麼不要這樣做,因爲它實際上不是一個數字,而是一個字符串! – naivists 2010-03-23 04:52:44

1

爲八進制轉換爲字符串,將它轉換:

$str = (string) 00032432; 

可以八進制和十進制之間的轉換與octdec功能和煎

<?php 
echo octdec('77') . "\n"; 
echo octdec(decoct(45)); 
?> 

http://uk.php.net/manual/en/function.octdec.php

+0

我曾經嘗試過那些。八進制數仍然顯示爲它們的等值,而不是字符串。即 - echo octdec(decoct(045));當我希望它顯示爲字符串045時顯示爲37。 – krx 2010-03-22 21:12:11

0

數據庫中的所有內容都自動成爲一個字符串。整數是字符串,日期是字符串,狗是字符串。

如果你正在做的事情不可思議,轉換到任何一個字符串:$a = (string) 12;

+0

我也試過這個。例如運行這個:$ a =(string)012; echo $ a; ....它的回聲10不是012. – krx 2010-03-22 21:13:06

+0

@ krio有意義,因爲八進制值在*字符串轉換之前被轉換*。不過,在你的例子中不應該是這種情況。 – 2010-03-22 21:51:33

+0

現在我讀了它 - 我從數據庫中獲取變量,但是它在使用之前被賦值爲一個值。它不直接插入到查詢中。 – krx 2010-03-22 21:57:09

1
$str = sprintf('%o', $octal_value);