2012-08-08 220 views
0

我希望使用配置單元「printf」功能,該功能從java formatter class上去掉諸如「1234」之類的字符串變成「1.2.34」 。或者,「4321」變成「4.3.21」等等。理想的情況是這樣的:使用hive printf格式化程序將「1234」變成「1.2.34」

SELECT PRINTF("x.x.xx", "4321"); 
// -> 4.3.21 

這可能嗎?如果是這樣,格式字符串是什麼?

我知道我可以用字符串concat做同樣的事情,但寧願不要。我在配置單元中工作,「1234」是一個昂貴的正則表達式的結果,我希望一步到位,而不用三次運行正則表達式或使用子查詢。

編輯:只是爲了澄清,這是在蜂巢。對不起,沒有提前說清楚。

+0

這是格式化程序需要做的唯一事情嗎?它總是4位數還是這裏有更多的邏輯?使用已知格式的字符串,您可以始終通過抓住​​特定索引處的字符並在其間插入點來構建您想要的字符串。 – Carl 2012-08-08 19:52:52

+0

它總是4位數字。我知道我可以抓住索引並在它們之間插入點,但這需要計算三次原始字符串。如SUBSTR(REGEXP(...),0,1)|| 「」 || SUBSTR(REGEXP(...),1,1)|| 「」 || SUBSTR(REGEXP(...),2,2)。這是我的最後手段,只是試圖看看是否有更好的方法來做到這一點:) – vasek1 2012-08-08 19:55:09

+0

您不能將結果存儲爲變量以便於訪問嗎?我對Hive一無所知,所以我很抱歉如果這是一個愚蠢的問題。 – Shaded 2012-08-08 19:56:07

回答

0

這可能有助於進一步的需求。

formatter = new DecimalFormat("#.#"); 
s = formatter.format(-1234.567);   // -1234.6 

編輯。 不確定您是否可以使用格式化程序完成此操作,如果其中沒有小數點。 看起來像一些以前的工作與字符串需要完成。檢查大衛的答案。

+0

這應該如何使用點運算符來格式化沒有小數位的數字? – 2012-08-08 20:02:16

+0

你的洞察力是對的,這無法達到目的。在一分鐘內編輯答案。 – 2012-08-08 20:14:17

0
String[] stringArray = "1234".split(""); 
// This will have a leading array entry of empty string, so chop it off somehow 
// EDIT: had the pattern wrong, fixed it 
System.out.println(String.format("%s.%s.%s%s", Arrays.copyOfRange(stringArray, 1, stringArray.length))); 
+0

根據您的建議檢查輸出必須是_x.x.xx_,而不是_x.x.x.x_。 – 2012-08-08 20:19:13

+0

@LuiggiMendoza編輯請求模式的答案。 – davidfmatheson 2012-08-09 12:26:50