void GncPreSplit::create_split (Transaction* trans) { if (created) return; /* Gently refuse to create the split if the basics are not set correctly * This should have been tested before calling this function though! */ auto check = verify_essentials(); if (!check.empty()) { PWARN ("Not creating split because essentials not set properly: %s", check.c_str()); return; } Account *account = nullptr; Account *taccount = nullptr; auto deposit = GncNumeric(); auto withdrawal = GncNumeric(); auto amount = GncNumeric(); if (m_account) account = *m_account; if (m_taccount) taccount = *m_taccount; if (m_deposit) deposit = *m_deposit; if (m_withdrawal) withdrawal = *m_withdrawal; amount = deposit + withdrawal; /* Add a split with the cumulative amount value. */ trans_add_split (trans, account, amount, m_action, m_memo, m_rec_state, m_rec_date, m_price); if (taccount) { /* Note: the current importer assumes at most 2 splits. This means the second split amount * will be the negative of the the first split amount. */ auto inv_price = m_price; if (m_price) inv_price = m_price->inv(); trans_add_split (trans, taccount, -amount, m_taction, m_tmemo, m_trec_state, m_trec_date, inv_price); } created = true; }
/** Convert str into a GncRational using the user-specified (import) currency format. * @param str The string to be parsed * @param currency_format The currency format to use. * @return a GncNumeric * @exception May throw std::invalid argument if string can't be parsed properly */ GncNumeric parse_amount (const std::string &str, int currency_format) { /* If a cell is empty or just spaces return invalid amount */ if(!boost::regex_search(str, boost::regex("[0-9]"))) throw std::invalid_argument (_("Value doesn't appear to contain a valid number.")); auto expr = boost::make_u32regex("[[:Sc:]]"); std::string str_no_symbols = boost::u32regex_replace(str, expr, ""); /* Convert based on user chosen currency format */ gnc_numeric val; char *endptr; switch (currency_format) { case 0: /* Currency locale */ if (!(xaccParseAmount (str_no_symbols.c_str(), TRUE, &val, &endptr))) throw std::invalid_argument (_("Value can't be parsed into a number using the selected currency format.")); break; case 1: /* Currency decimal period */ if (!(xaccParseAmountExtended (str_no_symbols.c_str(), TRUE, '-', '.', ',', "\003\003", "$+", &val, &endptr))) throw std::invalid_argument (_("Value can't be parsed into a number using the selected currency format.")); break; case 2: /* Currency decimal comma */ if (!(xaccParseAmountExtended (str_no_symbols.c_str(), TRUE, '-', ',', '.', "\003\003", "$+", &val, &endptr))) throw std::invalid_argument (_("Value can't be parsed into a number using the selected currency format.")); break; } return GncNumeric(val); }
/** Convert str into a GncRational using the user-specified (import) currency format. * @param str The string to be parsed * @param currency_format The currency format to use. * @return a GncNumeric * @exception May throw std::invalid argument if string can't be parsed properly */ GncNumeric parse_amount (const std::string &str, int currency_format) { /* An empty field is treated as zero */ if (str.empty()) return GncNumeric{}; /* Strings otherwise containing not digits will be considered invalid */ if(!boost::regex_search(str, boost::regex("[0-9]"))) throw std::invalid_argument (_("Value doesn't appear to contain a valid number.")); auto expr = boost::make_u32regex("[[:Sc:]]"); std::string str_no_symbols = boost::u32regex_replace(str, expr, ""); /* Convert based on user chosen currency format */ gnc_numeric val = gnc_numeric_zero(); char *endptr; switch (currency_format) { case 0: /* Currency locale */ if (!(xaccParseAmountPosSign (str_no_symbols.c_str(), TRUE, &val, &endptr, TRUE))) throw std::invalid_argument (_("Value can't be parsed into a number using the selected currency format.")); break; case 1: /* Currency decimal period */ if (!(xaccParseAmountExtended (str_no_symbols.c_str(), TRUE, '-', '.', ',', "\003\003", "$+", &val, &endptr))) throw std::invalid_argument (_("Value can't be parsed into a number using the selected currency format.")); break; case 2: /* Currency decimal comma */ if (!(xaccParseAmountExtended (str_no_symbols.c_str(), TRUE, '-', ',', '.', "\003\003", "$+", &val, &endptr))) throw std::invalid_argument (_("Value can't be parsed into a number using the selected currency format.")); break; } return GncNumeric(val); }