2015-11-02 48 views
1

我需要構建一個函數,它需要uin64_t(SATOSHI)並吐出一個BTC值的字符串。 我被告知沒有任何劃分/浮動,所以應該涉及普通的字符串操作。這是因爲如果我去智/ 1BTC我將結束了一個很好的價值,但將無法正確地將它轉換成一個字符串(由於四捨五入)C++將SATOSHI(uint64_t)轉換爲BTC(字符串)無浮點/雙

想不到如何做到這一點,知道如下:

uin64_t uiSatoshi = 1033468; 
uint64_t uiOneBTC = 100000000; 
std::string strBTC = ""; 

如何在UiSatoshi中構建strBTC,知道BTC有8位小數。

嘗試:

// SATOSHI TO STRING (for exchange) 
    int iSatoshi = 1033468; 
    double dVal = (double)iSatoshi/(double)100000000; 


    std::ostringstream out; 
    out << std::setprecision(8) << dVal; 
    std::string strOutput = out.str(); 

    printf("WRONG: %f\n", dVal); 
    printf("TEST: %s\n", strOutput.data()); 

WRONG:0.010335 TEST:0.01033468

但是失敗時uiSatoshi的值= 如結果是圓形的:TEST:1.0103347

而我想避免做浮點運算,只是使一個字符串超出我有的整數,在需要的地方添加前導零並放置點。

更新: 答案貼在這裏:C++ printf Rounding?

+0

我附加到您的上一個問題的評論的第二個鏈接顯示如何創建一個更多的小數位數字符串.. – Nim

+0

@Nim我已經檢查過,它不起作用,看到更新的任務。 – PeeS

+0

'uiOneBTC'將始終以'10^x'的形式出現嗎? – NathanOliver

回答

2

一個簡單的轉換例程可能如下:

#include <iostream> 
#include <string> 

using namespace std; 

string to_btc(uint64_t sat) { 
    auto s = to_string(sat); 

    if (s.length() < 8) { 
    // Prefix with 0s 
    s.insert(0, (8 - s.length()), '0'); 
    s.insert(0, "0.", 2); 
    } else if (s.length() == 8) { 
    s.insert(0, "0.", 2); 
    } else { 
    // Insert a '.' in the right place 
    s.insert(s.length() - 8, 1, '.'); 
    } 
    return s; 
} 

int main() 
{ 
    cout << to_btc(10346834567ULL) << endl; 
    cout << to_btc(1034683456ULL) << endl; 
    cout << to_btc(103468345) << endl; 
    cout << to_btc(10346834) << endl; 
    cout << to_btc(1034683) << endl; 
    cout << to_btc(10368) << endl; 
    cout << to_btc(1038) << endl; 
    cout << to_btc(132) << endl; 
    cout << to_btc(18) << endl; 
    cout << to_btc(1) << endl; 
    cout << to_btc(0) << endl; 
} 

無需花車,我不是說這是完成並準備生產,但我相信你可以對它進行徹底的測試,以檢查它是否符合你的期望。它可能會被優化 - 可能,但我會留下作爲一個練習...