pub fn price_decimals(reference: f64) -> usize {
let a = reference.abs();
if a >= 1000.0 {
2
} else if crate::tokens::is_stablecoin_price(a) {
6
} else if a >= 1.0 {
4
} else if a >= 0.01 {
6
} else if a >= 0.0001 {
8
} else {
10
}
}
pub fn format_price(price: f64) -> String {
format!("{price:.*}", price_decimals(price))
}
pub fn format_price_usd(price: f64) -> String {
format!("${}", format_price(price))
}
pub fn format_usd(value: f64) -> String {
format!("${}", format_large_number(value))
}
pub fn format_large_number(value: f64) -> String {
if value >= 1_000_000_000.0 {
format!("{:.2}B", value / 1_000_000_000.0)
} else if value >= 1_000_000.0 {
format!("{:.2}M", value / 1_000_000.0)
} else if value >= 1_000.0 {
format!("{:.2}K", value / 1_000.0)
} else {
format!("{:.2}", value)
}
}
pub fn format_token_balance(balance: &str, decimals: u8) -> String {
let balance_f64: f64 = balance.parse().unwrap_or(0.0);
let divisor = 10_f64.powi(decimals as i32);
let formatted = balance_f64 / divisor;
if formatted >= 1_000_000_000.0 {
format!("{:.2}B", formatted / 1_000_000_000.0)
} else if formatted >= 1_000_000.0 {
format!("{:.2}M", formatted / 1_000_000.0)
} else if formatted >= 1_000.0 {
format!("{:.2}K", formatted / 1_000.0)
} else {
format!("{:.4}", formatted)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_format_usd() {
assert_eq!(format_usd(1_500_000_000.0), "$1.50B");
assert_eq!(format_usd(1_500_000.0), "$1.50M");
assert_eq!(format_usd(1_500.0), "$1.50K");
assert_eq!(format_usd(15.50), "$15.50");
assert_eq!(format_usd(0.0), "$0.00");
}
#[test]
fn test_format_large_number() {
assert_eq!(format_large_number(500.0), "500.00");
assert_eq!(format_large_number(1_500.0), "1.50K");
assert_eq!(format_large_number(1_500_000.0), "1.50M");
assert_eq!(format_large_number(1_500_000_000.0), "1.50B");
}
#[test]
fn test_format_token_balance() {
assert!(format_token_balance("1000000000000000000", 18).starts_with("1.00"));
assert!(format_token_balance("5000000000000000000", 18).contains("5.00"));
assert!(format_token_balance("0", 18).starts_with("0.00"));
}
}