2009-09-07 5 views
2

나는 로케일 설정에 따라 locale.format 꽤 인쇄 번호를 사용할 수 있습니다하스켈에서 지역에 따라 숫자의 형식을 지정하는 방법은 무엇입니까? 파이썬에서

>>> import locale 
>>> locale.setlocale(locale.LC_ALL, "en_US.UTF-8") 
'en_US.UTF-8' 
>>> locale.format("%.2f",1234567.89,grouping=True) 
'1,234,567.89' 

어떻게 하스켈에서 동일한 작업을 수행 할 수 있습니까? localeconv and setlocale 바인딩이 있다는 것을 알지만, Lconv을 존중하는 일반 예쁜 프린터가 있습니까?

+0

다른 로케일이나 항상 동일합니까? 나는 그것이 어떤 권리를 위해 다르다고 생각하니? – yairchu

+0

이 예는 소수 구분 기호입니다. 미국에서는 5.3을 쓰고 일부 국가에서는 예를 들어 독일, 당신은 5,3을 쓸 것입니다. – mrueg

+0

예, subw가 맞습니다. 지역 설정에 따라 다르며 형식은 국가마다 다릅니다. 그것은 Lconv 구조로 분류됩니다. 실제로 세 가지 중요한 매개 변수가 있습니다. 소수점, 천 단위 구분 기호 및 각 그룹의 크기입니다. 화폐 가치에 대한 추가 매개 변수가 있습니다. – sastanin

답변

1

내가 말하고자하는 것은 문제의 라이브러리가 누락 된 경우 자신에게 하나 (분명한 옵션, 쉽지 않음)를 쓰거나 필요한 기능에 대한 바인딩을 쓸 수 있다는 것입니다. 예를 들어, 전용의 sprintf 받을수 sprintf 바인딩 제한 두 배로

Double.hs :

{-# INCLUDE "double.h" #-} 
{-# LANGUAGE ForeignFunctionInterface #-} 
module Double (cPrintf) where 

import Foreign 
import Foreign.C.Types 
import System.IO.Unsafe 
import qualified Data.ByteString as B 

foreign import ccall "double.h toString" 
c_toString :: CDouble -> (Ptr Word8) -> CInt -> IO CInt 

buf = unsafePerformIO $ mallocBytes 64 

cPrintf :: Double -> B.ByteString 
cPrintf n = B.pack $ unsafePerformIO $ do 
    len <- c_toString (realToFrac n) buf 64 
    peekArray (fromIntegral len) buf 

double.h :

int toString(double a, char *buffer, int bufferLen); 

double.c :

#include <stdio.h> 
#include "double.h" 

int toString(double a, char *buffer, int bufferLen) { 
return snprintf(buffer, bufferLen, "%f", a); 
} 

빌드 이름 :

gcc -c double.c 
ghc --make Main.hs double.o 
+0

글쎄, 내가 예상했던 것보다 덜 복잡해 보인다. 감사. – sastanin