2011-11-29 62 views
2

在PHP中,我導入一些文本文件,其中包含以空格分隔的浮點值表。所有值都包含兩個小數位。一個典型的行會是這樣的:在一個字符串中插入一個空格2位後小數

1.45 22.87 99.12 19.55 

然而,一些線路,如果小數點前的數字是3個位數,原始文件有時不包含空格。所以應該是什麼:

1.45 122.87 99.12 19.55 

進來爲:

1.45122.87 99.12 19.55 

我想我需要做的是尋找小數字符串,然後看2個空格後,如果沒有一個我需要添加一個空間。我不能爲了我的生活找出最直接的方式來做到這一點。

+0

您的意思是它既沒有分隔也沒有固定寬度? –

+0

總是有2個數字在「。」之後? – powtac

+1

它是空格分隔的,但並非總是如此,小數點後總有2位數字。 – Laravelian

回答

1

我會用正則表達式:

$pattern = "/(-)?\d{1,}\.\d{2}/"; 
    preg_match_all($pattern, "1.45122.87 99.12 19.55", $matches); 
    print_r($matches); 

DEMO

+0

將模式更改爲「/(-)?d{1,}\.\d{2}/」以解釋負值,並且這種方式就像魅力一樣! – Laravelian

-2

我會做這樣的事情,說的小數行是一個變量,名爲$行:

$parts = explode(' ', $line); 

現在你有小數數值數組,所以

$parts[0] = "1.45" 
(float)$parts[0] = 1.45 
$parts[1] = "122.87" 
(float)$parts[1] = 122.87 
// etc... 
+0

並非所有數字都包含它們之間的空格。 – Brad

+0

我會得到的將是$ parts [0] = 1.45122.87我想要做的是將字符串INTO 1.45 1.22,而不是它。 – Laravelian

+0

爲什麼你不能只備份和重新處理原始文件? –

0

這是一個固定列寬的文件。我會解析這些由substr()

http://php.net/manual/en/function.substr.php

for ($x=0; $x<strlen($line); $x+=4) { 
    $parts[] = trim(substr($line, $x, 4)); 
} 

這將讓你在各個領域的$parts數組。這是未經測試的,但應該工作。

+0

$ x沒有在您的循環中增加 –

+0

@AdamBailin,謝謝,修正。 – Brad

0
$line = '1.45122.87 99.12 19.55'; 
preg_match_all('~([0-9]{1,3}\.[0-9]{2})~', $line, $matches); 
var_dump($matches[1]); 

/* 
    Result: 

    array(4) { 
    [0]=> 
    string(4) "1.45" 
    [1]=> 
    string(6) "122.87" 
    [2]=> 
    string(5) "99.12" 
    [3]=> 
    string(5) "19.55" 
    } 

*/ 
0

這你想要做什麼。雖然可能不是最有效的方法。

<?php 
    $line = "1.45122.87 99.12 19.55"; 

    $length = strlen($line); 
    $result = ''; 
    $i=0; 
    while ($i<$length) 
    { 
     if ($line[$i] == '.') 
     { 
      $result .= $line[$i]; 
      $result .= $line[$i+1]; 
      $result .= $line[$i+2]; 
      $result .= ' '; 
      $i += 3; 
     } 
     else if ($line[$i] == ' ') 
     { 
      $i++; 
     } 
     else 
     { 
      $result .= $line[$i]; 
      $i++; 
     } 
    } 

    echo $result; 
?> 
0

你可以使用使preg_split()使用正則表達式

$lineArray = preg_split("/(\d+(\.\d{1,2})?)/", $lineOfNumbers); 

這會發現####的所有實例創建線組成的數組。##,而不用擔心空間

相關問題