내가 말하고자하는 것은 문제의 라이브러리가 누락 된 경우 자신에게 하나 (분명한 옵션, 쉽지 않음)를 쓰거나 필요한 기능에 대한 바인딩을 쓸 수 있다는 것입니다. 예를 들어, 전용의 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
다른 로케일이나 항상 동일합니까? 나는 그것이 어떤 권리를 위해 다르다고 생각하니? – yairchu
이 예는 소수 구분 기호입니다. 미국에서는 5.3을 쓰고 일부 국가에서는 예를 들어 독일, 당신은 5,3을 쓸 것입니다. – mrueg
예, subw가 맞습니다. 지역 설정에 따라 다르며 형식은 국가마다 다릅니다. 그것은 Lconv 구조로 분류됩니다. 실제로 세 가지 중요한 매개 변수가 있습니다. 소수점, 천 단위 구분 기호 및 각 그룹의 크기입니다. 화폐 가치에 대한 추가 매개 변수가 있습니다. – sastanin