2016-03-28 18 views
4

Kümeleri binlerce ayırıcı olarak göstermek için bir tamsayı biçimlendirmek için sprintf nasıl kullanılır?Bir ayırıcıyı virgülle ayırmak için sprintf'i binlik ayırıcılar olarak kullanma

String.Format kullanarak nasıl yapılacağını biliyorum, ancak sprintf kullanarak bunu yapamıyorum.

DÜZENLEME: Fyodor Soikin yorumuyla dayanarak aşağıda, ben bu kodu çalıştı:

printf "%a" (fun writer (value:int) -> writer.Write("{0:#,#}", value)) 10042 
let s = sprintf "%a" (fun writer (value:int) -> writer.Write("{0:#,#}", value)) 10042 

Printf çağrı işleri (ama ben Metin atayabilirsiniz bir dize olmak istiyormusunuz oysa standart çıktıya yazar Örneğin bir WPF kontrolünün içerik özelliği.

Sprintf çağrısı FS0039 hatası ile başarısız oluyor: Alan, yapıcı veya 'Yazma' üyesi tanımlı değil.

Bu hatayı düzeltebilirseniz, bu mümkün olan en doğrudan çözüm olabilir ve kısmi uygulama ile birleştirildiğinde, yerleşik bir sürüm kadar kısa olacaktır.

+0

İlgi: [F # biçiminde biçimlendirilmiş tarih nasıl yazdırılır] (http : //stackoverflow.com/questions/30590473/how-to-print-formatted-date-in-f/30593441#30593441) –

cevap

1

Bu işler, ancak daha basit bir yol olmalıdır.

let thousands(x:int64) = 
    System.String.Format("{0:#,0}", x) 

let s = sprintf "%s" (thousands(0L)) 
printfn "%s" s 

let s = sprintf "%s" (thousands(1L)) 
printfn "%s" s 

let s = sprintf "%s" (thousands(1000L)) 
printfn "%s" s 

let s = sprintf "%s" (thousands(1000000L)) 
printfn "%s" s 

0 
1 
1,000 
1,000,000 

Eğer Printf modülü ile, böyle yapmak yapamam yana Biraz daha iyi bir sürümü

let printNumber (x : int) : string = 
    System.String.Format("{0:N0}",x) 
+0

Üzgünüm, bu hile. String.Format'a güvenmeyen bir cevap arıyorum. Başka bir deyişle, .NET framework kitaplıklarını değil sadece sprintf'i kullanıyor. Denediğin için teşekkürler. –

+4

İlk olarak, bunu F # formatı belirleyicileri ile yapmanın bir yolu yoktur. İkincisi, hayal kırıklığı uğruna özür dilerim, ancak F # formatı işlevleri, özellikle 'TextWriter' altında .NET FW kütüphaneleri kullanıyor. Ve aslında, '% t' veya '% a' biçim belirteci kullanarak' TextWriter 'in temelini oluşturabilirsin. –

2

:

/// Calls ToString on the given object, passing in a format-string value. 
let inline stringf format (x : ^a) = 
    (^a : (member ToString : string -> string) (x, format)) 

Ve sonra böyle diyoruz:

someNumber |> stringf "N0" 
+0

Bu ilginç, ama ToString'i kullanmak String.Format kullanmaktan daha iyi olmadığından "X Ödülü" ödülünü veremem. Çözümünüzü, aşağıdaki örnekte, ToString'i doğrudan bir OO modasında arayarak kullanabildim. Ama ben hala bir F # başlangıççıyım, bu yüzden senin bir sözdizimiyle kafam karıştı. Ben '(genel bir değer) aşina, ama ne^a? Teşekkürler! let x = 42345 |> stringf "N0" // -> val x: string = "42,345" let x '= 44325L.ToString ("N0") // -> val x': string = " 44,325 " –

+1

" a "ile" satır içi "işlevi temelde ördek tipi yazım olarak düşünülebilir. Bu durumda, "stringf" işlevi, giriş olarak bir dize alan ve bir dize döndüren bir "ToString" yöntemine sahip herhangi bir nesne ile çalışır. ToString için aşırı yüklenme olmayan bir nesne ile kullanmayı denerseniz, bir derleyici hatası alırsınız. Başka bir deyişle, 'stringf'' ToString (string) 'işlevini çağırmanın işlevsel bir yoludur, tıpkı yerleşik' dize' işlevinin 'ToString() 'işlevini çağırmanın işlevsel bir yoludur. "String.Format kullanmanın daha iyi bir yolu yok" diye düşünürsek, daha iyi olduğunu düşündüğünüz nedir? –

+1

Teknik olarak bir "Üye Kısıtlaması Çağırma İfadesi" dir. [F # spec] 'da (http://fsharp.org/specs/language-spec/) açıklanmıştır. – kaefer

İlgili konular