fix: show 0 balance with decimals in classic denomination - #467

Merged
ovitrif merged 2 commits into
masterfrom
fix/zero-denomination
Nov 14, 2025
Merged

fix: show 0 balance with decimals in classic denomination#467
ovitrif merged 2 commits into
masterfrom
fix/zero-denomination

Conversation

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Closes#342.

Description

Show 0 balance with decimals in classic denomination.
To be consistent with bitkit-ios and RN.

Preview

Screenshot 2025-11-14 at 11 11 49

QA Notes

synonymdev/bitkit-e2e-tests#46

@claude

claudeBot commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Code Review for PR #467

Summary

This PR fixes issue #342 by ensuring that zero balances display with proper decimal places (0.00000000) in classic BTC denomination, maintaining consistency with the iOS and React Native versions of Bitkit.


✅ Positive Aspects

  1. Correct Fix: The change properly addresses the root cause - the old pattern "###.########" would omit trailing zeros and all decimal places for zero values, while the new pattern "0.00000000" enforces all 8 decimal places.

  2. Clean Implementation: The refactoring improves code clarity by:

    • Using string repetition for the pattern: "0.${"0".repeat(CLASSIC_DECIMALS)}"
    • Explicitly setting min/max fraction digits to ensure consistent formatting
    • Removing the intermediate sats variable (minor cleanup)
  3. Consistency: Aligns the Android app with iOS and RN implementations, providing a unified UX across platforms.

  4. Uses Constants: Properly leverages the existing CLASSIC_DECIMALS constant.


📋 Code Quality & Best Practices

Good:

  • Follows Kotlin conventions
  • Uses DecimalFormat properly with explicit configuration
  • Code is readable and maintainable

Minor Suggestions:

  • The pattern string construction could be extracted to a constant for reusability if this pattern is needed elsewhere
  • Consider adding a KDoc comment explaining the formatting behavior for zero values

🐛 Potential Issues

None identified. The change is focused and correct.


⚡ Performance Considerations

No concerns. The change is minimal:

  • String concatenation happens once per call (negligible overhead)
  • Setting formatter properties is standard practice
  • No performance regression expected

🔒 Security Concerns

None. This is a pure formatting change with no security implications.


🧪 Test Coverage

Observation: There are no direct unit tests for formatToClassicDisplay() or formatToModernDisplay() extension functions.

Recommendation: Consider adding unit tests to cover edge cases like zero values, 1 BTC, and fractional values.

Note: I see you have E2E tests referenced (bitkit-e2e-tests #46), which is good for catching visual regressions, but unit tests would provide faster feedback during development.


✨ Overall Assessment

Status: LGTM with minor suggestion

This is a clean, focused fix that properly addresses the reported issue. The implementation is correct and the code quality is good.

Recommendation: Approve and merge, with optional follow-up to add unit tests for these formatting functions.

Nice work on the fix!

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR fixes the display of zero Bitcoin balance in classic denomination to show all 8 decimal places (e.g., "0.00000000" instead of "0"), ensuring consistency with the iOS and React Native versions of Bitkit.

  • Changed the decimal format pattern from "###.########" (which hides trailing zeros) to "0.00000000" (which enforces 8 decimal places)
  • Updated the formatter configuration to explicitly set minimum and maximum fraction digits to CLASSIC_DECIMALS (8)
  • Removed unnecessary intermediate variable sats for cleaner code

@claude

claudeBot commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Pull Request Review: Fix Classic BTC Display for Zero Balance

Overview

This PR fixes issue #342 where zero balances in Classic BTC denomination were displayed as 0 instead of 0.00000000. The fix ensures consistency with bitkit-ios and the React Native version.

Code Quality ✅

Strengths:

  • Clear and focused change that directly addresses the issue
  • Proper use of CLASSIC_DECIMALS constant consistently
  • Good code organization with explicit DecimalFormat configuration

Suggestions:

  1. Pattern construction (Currency.kt:112): The dynamic pattern generation could be defined as a constant for better reusability and performance
  2. Code consistency: Consider extracting format patterns as constants for maintainability

Potential Bugs/Issues ✅

No critical bugs identified, observations:

  1. Locale handling: The fix properly preserves locale-based decimal separators. Tests only verify Locale.US - consider testing European locales with comma decimal separators
  2. Pattern change from optional to required leading/trailing zeros is correct for the fix
  3. Removed unnecessary variable assignment improves clarity

Performance Considerations ✅

Positive impact:

  1. String concatenation for pattern could be pre-computed as constant
  2. DecimalFormat configuration is correct and prevents unnecessary allocations
  3. Minor: Creates new DecimalFormat per call - acceptable for typical usage

Security Concerns ✅

No security issues. Changes maintain type safety, no user input vulnerabilities, and use safe BigDecimal operations.

Test Coverage ⚠️

Good coverage, could be enhanced:

Existing tests:

  • formatToModernDisplay uses space grouping ✅
  • formatToModernDisplay handles zero ✅
  • formatToClassicDisplay always shows eight decimals ✅ (directly tests the fix)
  • formatToClassicDisplay converts sats to btc ✅

Recommended additions:

  1. Edge cases: maximum value, negative values
  2. Locale-specific tests for different decimal separators
  3. Trailing zeros for whole BTC values (100000000 sats = 1.00000000)
  4. Integration test for end-to-end display

Alignment with Issue #342

  • Zero balance displays as 0.00000000 in Classic denomination ✅
  • Consistent with bitkit-ios and React Native ✅
  • Screenshot shows expected behavior ✅

Additional Observations

  1. E2E Tests linked (bitkit-e2e-tests#46) - excellent
  2. ULong.formatToModernDisplay exists but no ULong.formatToClassicDisplay - consider for API completeness
  3. Consider adding KDoc comments explaining Modern vs Classic terminology

Summary

Recommendation: Approve with minor suggestions

Well-executed fix with minimal, focused changes and appropriate test coverage. Main suggestions:

  1. Extract format pattern as constant for performance/clarity
  2. Add edge-case tests (negative, locales, max values)
  3. Verify E2E tests pass

Great work on this fix! 🎉

@ovitrifovitrif left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👏🏻 Thanks for this nice work

@ovitrif
ovitrif merged commit 5ebe394 into masterNov 14, 2025
13 checks passed
@ovitrif
ovitrif deleted the fix/zero-denomination branch November 14, 2025 12:14
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Classic BTC denomination does not show correctly when 0 balance.

3 participants

@piotr-iohk@ovitrif
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix: show 0 balance with decimals in classic denomination - #467

Merged
ovitrif merged 2 commits into
masterfrom
fix/zero-denomination
Nov 14, 2025
Merged

fix: show 0 balance with decimals in classic denomination#467
ovitrif merged 2 commits into
masterfrom
fix/zero-denomination

Conversation

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Closes#342.

Description

Show 0 balance with decimals in classic denomination.
To be consistent with bitkit-ios and RN.

Preview

Screenshot 2025-11-14 at 11 11 49

QA Notes

synonymdev/bitkit-e2e-tests#46

@claude

claudeBot commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Code Review for PR #467

Summary

This PR fixes issue #342 by ensuring that zero balances display with proper decimal places (0.00000000) in classic BTC denomination, maintaining consistency with the iOS and React Native versions of Bitkit.


✅ Positive Aspects

  1. Correct Fix: The change properly addresses the root cause - the old pattern "###.########" would omit trailing zeros and all decimal places for zero values, while the new pattern "0.00000000" enforces all 8 decimal places.

  2. Clean Implementation: The refactoring improves code clarity by:

    • Using string repetition for the pattern: "0.${"0".repeat(CLASSIC_DECIMALS)}"
    • Explicitly setting min/max fraction digits to ensure consistent formatting
    • Removing the intermediate sats variable (minor cleanup)
  3. Consistency: Aligns the Android app with iOS and RN implementations, providing a unified UX across platforms.

  4. Uses Constants: Properly leverages the existing CLASSIC_DECIMALS constant.


📋 Code Quality & Best Practices

Good:

  • Follows Kotlin conventions
  • Uses DecimalFormat properly with explicit configuration
  • Code is readable and maintainable

Minor Suggestions:

  • The pattern string construction could be extracted to a constant for reusability if this pattern is needed elsewhere
  • Consider adding a KDoc comment explaining the formatting behavior for zero values

🐛 Potential Issues

None identified. The change is focused and correct.


⚡ Performance Considerations

No concerns. The change is minimal:

  • String concatenation happens once per call (negligible overhead)
  • Setting formatter properties is standard practice
  • No performance regression expected

🔒 Security Concerns

None. This is a pure formatting change with no security implications.


🧪 Test Coverage

Observation: There are no direct unit tests for formatToClassicDisplay() or formatToModernDisplay() extension functions.

Recommendation: Consider adding unit tests to cover edge cases like zero values, 1 BTC, and fractional values.

Note: I see you have E2E tests referenced (bitkit-e2e-tests #46), which is good for catching visual regressions, but unit tests would provide faster feedback during development.


✨ Overall Assessment

Status: LGTM with minor suggestion

This is a clean, focused fix that properly addresses the reported issue. The implementation is correct and the code quality is good.

Recommendation: Approve and merge, with optional follow-up to add unit tests for these formatting functions.

Nice work on the fix!

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR fixes the display of zero Bitcoin balance in classic denomination to show all 8 decimal places (e.g., "0.00000000" instead of "0"), ensuring consistency with the iOS and React Native versions of Bitkit.

  • Changed the decimal format pattern from "###.########" (which hides trailing zeros) to "0.00000000" (which enforces 8 decimal places)
  • Updated the formatter configuration to explicitly set minimum and maximum fraction digits to CLASSIC_DECIMALS (8)
  • Removed unnecessary intermediate variable sats for cleaner code

@claude

claudeBot commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Pull Request Review: Fix Classic BTC Display for Zero Balance

Overview

This PR fixes issue #342 where zero balances in Classic BTC denomination were displayed as 0 instead of 0.00000000. The fix ensures consistency with bitkit-ios and the React Native version.

Code Quality ✅

Strengths:

  • Clear and focused change that directly addresses the issue
  • Proper use of CLASSIC_DECIMALS constant consistently
  • Good code organization with explicit DecimalFormat configuration

Suggestions:

  1. Pattern construction (Currency.kt:112): The dynamic pattern generation could be defined as a constant for better reusability and performance
  2. Code consistency: Consider extracting format patterns as constants for maintainability

Potential Bugs/Issues ✅

No critical bugs identified, observations:

  1. Locale handling: The fix properly preserves locale-based decimal separators. Tests only verify Locale.US - consider testing European locales with comma decimal separators
  2. Pattern change from optional to required leading/trailing zeros is correct for the fix
  3. Removed unnecessary variable assignment improves clarity

Performance Considerations ✅

Positive impact:

  1. String concatenation for pattern could be pre-computed as constant
  2. DecimalFormat configuration is correct and prevents unnecessary allocations
  3. Minor: Creates new DecimalFormat per call - acceptable for typical usage

Security Concerns ✅

No security issues. Changes maintain type safety, no user input vulnerabilities, and use safe BigDecimal operations.

Test Coverage ⚠️

Good coverage, could be enhanced:

Existing tests:

  • formatToModernDisplay uses space grouping ✅
  • formatToModernDisplay handles zero ✅
  • formatToClassicDisplay always shows eight decimals ✅ (directly tests the fix)
  • formatToClassicDisplay converts sats to btc ✅

Recommended additions:

  1. Edge cases: maximum value, negative values
  2. Locale-specific tests for different decimal separators
  3. Trailing zeros for whole BTC values (100000000 sats = 1.00000000)
  4. Integration test for end-to-end display

Alignment with Issue #342

  • Zero balance displays as 0.00000000 in Classic denomination ✅
  • Consistent with bitkit-ios and React Native ✅
  • Screenshot shows expected behavior ✅

Additional Observations

  1. E2E Tests linked (bitkit-e2e-tests#46) - excellent
  2. ULong.formatToModernDisplay exists but no ULong.formatToClassicDisplay - consider for API completeness
  3. Consider adding KDoc comments explaining Modern vs Classic terminology

Summary

Recommendation: Approve with minor suggestions

Well-executed fix with minimal, focused changes and appropriate test coverage. Main suggestions:

  1. Extract format pattern as constant for performance/clarity
  2. Add edge-case tests (negative, locales, max values)
  3. Verify E2E tests pass

Great work on this fix! 🎉

@ovitrifovitrif left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👏🏻 Thanks for this nice work

@ovitrif
ovitrif merged commit 5ebe394 into masterNov 14, 2025
13 checks passed
@ovitrif
ovitrif deleted the fix/zero-denomination branch November 14, 2025 12:14
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Classic BTC denomination does not show correctly when 0 balance.

3 participants

@piotr-iohk@ovitrif
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: show 0 balance with decimals in classic denomination - #467

Merged
ovitrif merged 2 commits into
masterfrom
fix/zero-denomination
Nov 14, 2025
Merged

fix: show 0 balance with decimals in classic denomination#467
ovitrif merged 2 commits into
masterfrom
fix/zero-denomination

Conversation

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Closes#342.

Description

Show 0 balance with decimals in classic denomination.
To be consistent with bitkit-ios and RN.

Preview

Screenshot 2025-11-14 at 11 11 49

QA Notes

synonymdev/bitkit-e2e-tests#46

@claude

claudeBot commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Code Review for PR #467

Summary

This PR fixes issue #342 by ensuring that zero balances display with proper decimal places (0.00000000) in classic BTC denomination, maintaining consistency with the iOS and React Native versions of Bitkit.


✅ Positive Aspects

  1. Correct Fix: The change properly addresses the root cause - the old pattern "###.########" would omit trailing zeros and all decimal places for zero values, while the new pattern "0.00000000" enforces all 8 decimal places.

  2. Clean Implementation: The refactoring improves code clarity by:

    • Using string repetition for the pattern: "0.${"0".repeat(CLASSIC_DECIMALS)}"
    • Explicitly setting min/max fraction digits to ensure consistent formatting
    • Removing the intermediate sats variable (minor cleanup)
  3. Consistency: Aligns the Android app with iOS and RN implementations, providing a unified UX across platforms.

  4. Uses Constants: Properly leverages the existing CLASSIC_DECIMALS constant.


📋 Code Quality & Best Practices

Good:

  • Follows Kotlin conventions
  • Uses DecimalFormat properly with explicit configuration
  • Code is readable and maintainable

Minor Suggestions:

  • The pattern string construction could be extracted to a constant for reusability if this pattern is needed elsewhere
  • Consider adding a KDoc comment explaining the formatting behavior for zero values

🐛 Potential Issues

None identified. The change is focused and correct.


⚡ Performance Considerations

No concerns. The change is minimal:

  • String concatenation happens once per call (negligible overhead)
  • Setting formatter properties is standard practice
  • No performance regression expected

🔒 Security Concerns

None. This is a pure formatting change with no security implications.


🧪 Test Coverage

Observation: There are no direct unit tests for formatToClassicDisplay() or formatToModernDisplay() extension functions.

Recommendation: Consider adding unit tests to cover edge cases like zero values, 1 BTC, and fractional values.

Note: I see you have E2E tests referenced (bitkit-e2e-tests #46), which is good for catching visual regressions, but unit tests would provide faster feedback during development.


✨ Overall Assessment

Status: LGTM with minor suggestion

This is a clean, focused fix that properly addresses the reported issue. The implementation is correct and the code quality is good.

Recommendation: Approve and merge, with optional follow-up to add unit tests for these formatting functions.

Nice work on the fix!

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR fixes the display of zero Bitcoin balance in classic denomination to show all 8 decimal places (e.g., "0.00000000" instead of "0"), ensuring consistency with the iOS and React Native versions of Bitkit.

  • Changed the decimal format pattern from "###.########" (which hides trailing zeros) to "0.00000000" (which enforces 8 decimal places)
  • Updated the formatter configuration to explicitly set minimum and maximum fraction digits to CLASSIC_DECIMALS (8)
  • Removed unnecessary intermediate variable sats for cleaner code

@claude

claudeBot commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Pull Request Review: Fix Classic BTC Display for Zero Balance

Overview

This PR fixes issue #342 where zero balances in Classic BTC denomination were displayed as 0 instead of 0.00000000. The fix ensures consistency with bitkit-ios and the React Native version.

Code Quality ✅

Strengths:

  • Clear and focused change that directly addresses the issue
  • Proper use of CLASSIC_DECIMALS constant consistently
  • Good code organization with explicit DecimalFormat configuration

Suggestions:

  1. Pattern construction (Currency.kt:112): The dynamic pattern generation could be defined as a constant for better reusability and performance
  2. Code consistency: Consider extracting format patterns as constants for maintainability

Potential Bugs/Issues ✅

No critical bugs identified, observations:

  1. Locale handling: The fix properly preserves locale-based decimal separators. Tests only verify Locale.US - consider testing European locales with comma decimal separators
  2. Pattern change from optional to required leading/trailing zeros is correct for the fix
  3. Removed unnecessary variable assignment improves clarity

Performance Considerations ✅

Positive impact:

  1. String concatenation for pattern could be pre-computed as constant
  2. DecimalFormat configuration is correct and prevents unnecessary allocations
  3. Minor: Creates new DecimalFormat per call - acceptable for typical usage

Security Concerns ✅

No security issues. Changes maintain type safety, no user input vulnerabilities, and use safe BigDecimal operations.

Test Coverage ⚠️

Good coverage, could be enhanced:

Existing tests:

  • formatToModernDisplay uses space grouping ✅
  • formatToModernDisplay handles zero ✅
  • formatToClassicDisplay always shows eight decimals ✅ (directly tests the fix)
  • formatToClassicDisplay converts sats to btc ✅

Recommended additions:

  1. Edge cases: maximum value, negative values
  2. Locale-specific tests for different decimal separators
  3. Trailing zeros for whole BTC values (100000000 sats = 1.00000000)
  4. Integration test for end-to-end display

Alignment with Issue #342

  • Zero balance displays as 0.00000000 in Classic denomination ✅
  • Consistent with bitkit-ios and React Native ✅
  • Screenshot shows expected behavior ✅

Additional Observations

  1. E2E Tests linked (bitkit-e2e-tests#46) - excellent
  2. ULong.formatToModernDisplay exists but no ULong.formatToClassicDisplay - consider for API completeness
  3. Consider adding KDoc comments explaining Modern vs Classic terminology

Summary

Recommendation: Approve with minor suggestions

Well-executed fix with minimal, focused changes and appropriate test coverage. Main suggestions:

  1. Extract format pattern as constant for performance/clarity
  2. Add edge-case tests (negative, locales, max values)
  3. Verify E2E tests pass

Great work on this fix! 🎉

@ovitrifovitrif left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👏🏻 Thanks for this nice work

@ovitrif
ovitrif merged commit 5ebe394 into masterNov 14, 2025
13 checks passed
@ovitrif
ovitrif deleted the fix/zero-denomination branch November 14, 2025 12:14
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Classic BTC denomination does not show correctly when 0 balance.

3 participants

@piotr-iohk@ovitrif
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: show 0 balance with decimals in classic denomination - #467

Merged
ovitrif merged 2 commits into
masterfrom
fix/zero-denomination
Nov 14, 2025
Merged

fix: show 0 balance with decimals in classic denomination#467
ovitrif merged 2 commits into
masterfrom
fix/zero-denomination

Conversation

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Closes#342.

Description

Show 0 balance with decimals in classic denomination.
To be consistent with bitkit-ios and RN.

Preview

Screenshot 2025-11-14 at 11 11 49

QA Notes

synonymdev/bitkit-e2e-tests#46

@claude

claudeBot commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Code Review for PR #467

Summary

This PR fixes issue #342 by ensuring that zero balances display with proper decimal places (0.00000000) in classic BTC denomination, maintaining consistency with the iOS and React Native versions of Bitkit.


✅ Positive Aspects

  1. Correct Fix: The change properly addresses the root cause - the old pattern "###.########" would omit trailing zeros and all decimal places for zero values, while the new pattern "0.00000000" enforces all 8 decimal places.

  2. Clean Implementation: The refactoring improves code clarity by:

    • Using string repetition for the pattern: "0.${"0".repeat(CLASSIC_DECIMALS)}"
    • Explicitly setting min/max fraction digits to ensure consistent formatting
    • Removing the intermediate sats variable (minor cleanup)
  3. Consistency: Aligns the Android app with iOS and RN implementations, providing a unified UX across platforms.

  4. Uses Constants: Properly leverages the existing CLASSIC_DECIMALS constant.


📋 Code Quality & Best Practices

Good:

  • Follows Kotlin conventions
  • Uses DecimalFormat properly with explicit configuration
  • Code is readable and maintainable

Minor Suggestions:

  • The pattern string construction could be extracted to a constant for reusability if this pattern is needed elsewhere
  • Consider adding a KDoc comment explaining the formatting behavior for zero values

🐛 Potential Issues

None identified. The change is focused and correct.


⚡ Performance Considerations

No concerns. The change is minimal:

  • String concatenation happens once per call (negligible overhead)
  • Setting formatter properties is standard practice
  • No performance regression expected

🔒 Security Concerns

None. This is a pure formatting change with no security implications.


🧪 Test Coverage

Observation: There are no direct unit tests for formatToClassicDisplay() or formatToModernDisplay() extension functions.

Recommendation: Consider adding unit tests to cover edge cases like zero values, 1 BTC, and fractional values.

Note: I see you have E2E tests referenced (bitkit-e2e-tests #46), which is good for catching visual regressions, but unit tests would provide faster feedback during development.


✨ Overall Assessment

Status: LGTM with minor suggestion

This is a clean, focused fix that properly addresses the reported issue. The implementation is correct and the code quality is good.

Recommendation: Approve and merge, with optional follow-up to add unit tests for these formatting functions.

Nice work on the fix!

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR fixes the display of zero Bitcoin balance in classic denomination to show all 8 decimal places (e.g., "0.00000000" instead of "0"), ensuring consistency with the iOS and React Native versions of Bitkit.

  • Changed the decimal format pattern from "###.########" (which hides trailing zeros) to "0.00000000" (which enforces 8 decimal places)
  • Updated the formatter configuration to explicitly set minimum and maximum fraction digits to CLASSIC_DECIMALS (8)
  • Removed unnecessary intermediate variable sats for cleaner code

@claude

claudeBot commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Pull Request Review: Fix Classic BTC Display for Zero Balance

Overview

This PR fixes issue #342 where zero balances in Classic BTC denomination were displayed as 0 instead of 0.00000000. The fix ensures consistency with bitkit-ios and the React Native version.

Code Quality ✅

Strengths:

  • Clear and focused change that directly addresses the issue
  • Proper use of CLASSIC_DECIMALS constant consistently
  • Good code organization with explicit DecimalFormat configuration

Suggestions:

  1. Pattern construction (Currency.kt:112): The dynamic pattern generation could be defined as a constant for better reusability and performance
  2. Code consistency: Consider extracting format patterns as constants for maintainability

Potential Bugs/Issues ✅

No critical bugs identified, observations:

  1. Locale handling: The fix properly preserves locale-based decimal separators. Tests only verify Locale.US - consider testing European locales with comma decimal separators
  2. Pattern change from optional to required leading/trailing zeros is correct for the fix
  3. Removed unnecessary variable assignment improves clarity

Performance Considerations ✅

Positive impact:

  1. String concatenation for pattern could be pre-computed as constant
  2. DecimalFormat configuration is correct and prevents unnecessary allocations
  3. Minor: Creates new DecimalFormat per call - acceptable for typical usage

Security Concerns ✅

No security issues. Changes maintain type safety, no user input vulnerabilities, and use safe BigDecimal operations.

Test Coverage ⚠️

Good coverage, could be enhanced:

Existing tests:

  • formatToModernDisplay uses space grouping ✅
  • formatToModernDisplay handles zero ✅
  • formatToClassicDisplay always shows eight decimals ✅ (directly tests the fix)
  • formatToClassicDisplay converts sats to btc ✅

Recommended additions:

  1. Edge cases: maximum value, negative values
  2. Locale-specific tests for different decimal separators
  3. Trailing zeros for whole BTC values (100000000 sats = 1.00000000)
  4. Integration test for end-to-end display

Alignment with Issue #342

  • Zero balance displays as 0.00000000 in Classic denomination ✅
  • Consistent with bitkit-ios and React Native ✅
  • Screenshot shows expected behavior ✅

Additional Observations

  1. E2E Tests linked (bitkit-e2e-tests#46) - excellent
  2. ULong.formatToModernDisplay exists but no ULong.formatToClassicDisplay - consider for API completeness
  3. Consider adding KDoc comments explaining Modern vs Classic terminology

Summary

Recommendation: Approve with minor suggestions

Well-executed fix with minimal, focused changes and appropriate test coverage. Main suggestions:

  1. Extract format pattern as constant for performance/clarity
  2. Add edge-case tests (negative, locales, max values)
  3. Verify E2E tests pass

Great work on this fix! 🎉

@ovitrifovitrif left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👏🏻 Thanks for this nice work

@ovitrif
ovitrif merged commit 5ebe394 into masterNov 14, 2025
13 checks passed
@ovitrif
ovitrif deleted the fix/zero-denomination branch November 14, 2025 12:14
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Classic BTC denomination does not show correctly when 0 balance.

3 participants

@piotr-iohk@ovitrif
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix: show 0 balance with decimals in classic denomination - #467

Merged
ovitrif merged 2 commits into
masterfrom
fix/zero-denomination
Nov 14, 2025
Merged

fix: show 0 balance with decimals in classic denomination#467
ovitrif merged 2 commits into
masterfrom
fix/zero-denomination

Conversation

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Closes#342.

Description

Show 0 balance with decimals in classic denomination.
To be consistent with bitkit-ios and RN.

Preview

Screenshot 2025-11-14 at 11 11 49

QA Notes

synonymdev/bitkit-e2e-tests#46

@claude

claudeBot commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Code Review for PR #467

Summary

This PR fixes issue #342 by ensuring that zero balances display with proper decimal places (0.00000000) in classic BTC denomination, maintaining consistency with the iOS and React Native versions of Bitkit.


✅ Positive Aspects

  1. Correct Fix: The change properly addresses the root cause - the old pattern "###.########" would omit trailing zeros and all decimal places for zero values, while the new pattern "0.00000000" enforces all 8 decimal places.

  2. Clean Implementation: The refactoring improves code clarity by:

    • Using string repetition for the pattern: "0.${"0".repeat(CLASSIC_DECIMALS)}"
    • Explicitly setting min/max fraction digits to ensure consistent formatting
    • Removing the intermediate sats variable (minor cleanup)
  3. Consistency: Aligns the Android app with iOS and RN implementations, providing a unified UX across platforms.

  4. Uses Constants: Properly leverages the existing CLASSIC_DECIMALS constant.


📋 Code Quality & Best Practices

Good:

  • Follows Kotlin conventions
  • Uses DecimalFormat properly with explicit configuration
  • Code is readable and maintainable

Minor Suggestions:

  • The pattern string construction could be extracted to a constant for reusability if this pattern is needed elsewhere
  • Consider adding a KDoc comment explaining the formatting behavior for zero values

🐛 Potential Issues

None identified. The change is focused and correct.


⚡ Performance Considerations

No concerns. The change is minimal:

  • String concatenation happens once per call (negligible overhead)
  • Setting formatter properties is standard practice
  • No performance regression expected

🔒 Security Concerns

None. This is a pure formatting change with no security implications.


🧪 Test Coverage

Observation: There are no direct unit tests for formatToClassicDisplay() or formatToModernDisplay() extension functions.

Recommendation: Consider adding unit tests to cover edge cases like zero values, 1 BTC, and fractional values.

Note: I see you have E2E tests referenced (bitkit-e2e-tests #46), which is good for catching visual regressions, but unit tests would provide faster feedback during development.


✨ Overall Assessment

Status: LGTM with minor suggestion

This is a clean, focused fix that properly addresses the reported issue. The implementation is correct and the code quality is good.

Recommendation: Approve and merge, with optional follow-up to add unit tests for these formatting functions.

Nice work on the fix!

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR fixes the display of zero Bitcoin balance in classic denomination to show all 8 decimal places (e.g., "0.00000000" instead of "0"), ensuring consistency with the iOS and React Native versions of Bitkit.

  • Changed the decimal format pattern from "###.########" (which hides trailing zeros) to "0.00000000" (which enforces 8 decimal places)
  • Updated the formatter configuration to explicitly set minimum and maximum fraction digits to CLASSIC_DECIMALS (8)
  • Removed unnecessary intermediate variable sats for cleaner code

@claude

claudeBot commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Pull Request Review: Fix Classic BTC Display for Zero Balance

Overview

This PR fixes issue #342 where zero balances in Classic BTC denomination were displayed as 0 instead of 0.00000000. The fix ensures consistency with bitkit-ios and the React Native version.

Code Quality ✅

Strengths:

  • Clear and focused change that directly addresses the issue
  • Proper use of CLASSIC_DECIMALS constant consistently
  • Good code organization with explicit DecimalFormat configuration

Suggestions:

  1. Pattern construction (Currency.kt:112): The dynamic pattern generation could be defined as a constant for better reusability and performance
  2. Code consistency: Consider extracting format patterns as constants for maintainability

Potential Bugs/Issues ✅

No critical bugs identified, observations:

  1. Locale handling: The fix properly preserves locale-based decimal separators. Tests only verify Locale.US - consider testing European locales with comma decimal separators
  2. Pattern change from optional to required leading/trailing zeros is correct for the fix
  3. Removed unnecessary variable assignment improves clarity

Performance Considerations ✅

Positive impact:

  1. String concatenation for pattern could be pre-computed as constant
  2. DecimalFormat configuration is correct and prevents unnecessary allocations
  3. Minor: Creates new DecimalFormat per call - acceptable for typical usage

Security Concerns ✅

No security issues. Changes maintain type safety, no user input vulnerabilities, and use safe BigDecimal operations.

Test Coverage ⚠️

Good coverage, could be enhanced:

Existing tests:

  • formatToModernDisplay uses space grouping ✅
  • formatToModernDisplay handles zero ✅
  • formatToClassicDisplay always shows eight decimals ✅ (directly tests the fix)
  • formatToClassicDisplay converts sats to btc ✅

Recommended additions:

  1. Edge cases: maximum value, negative values
  2. Locale-specific tests for different decimal separators
  3. Trailing zeros for whole BTC values (100000000 sats = 1.00000000)
  4. Integration test for end-to-end display

Alignment with Issue #342

  • Zero balance displays as 0.00000000 in Classic denomination ✅
  • Consistent with bitkit-ios and React Native ✅
  • Screenshot shows expected behavior ✅

Additional Observations

  1. E2E Tests linked (bitkit-e2e-tests#46) - excellent
  2. ULong.formatToModernDisplay exists but no ULong.formatToClassicDisplay - consider for API completeness
  3. Consider adding KDoc comments explaining Modern vs Classic terminology

Summary

Recommendation: Approve with minor suggestions

Well-executed fix with minimal, focused changes and appropriate test coverage. Main suggestions:

  1. Extract format pattern as constant for performance/clarity
  2. Add edge-case tests (negative, locales, max values)
  3. Verify E2E tests pass

Great work on this fix! 🎉

@ovitrifovitrif left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👏🏻 Thanks for this nice work

@ovitrif
ovitrif merged commit 5ebe394 into masterNov 14, 2025
13 checks passed
@ovitrif
ovitrif deleted the fix/zero-denomination branch November 14, 2025 12:14
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Classic BTC denomination does not show correctly when 0 balance.

3 participants

@piotr-iohk@ovitrif
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: show 0 balance with decimals in classic denomination - #467

Merged
ovitrif merged 2 commits into
masterfrom
fix/zero-denomination
Nov 14, 2025
Merged

fix: show 0 balance with decimals in classic denomination#467
ovitrif merged 2 commits into
masterfrom
fix/zero-denomination

Conversation

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Closes#342.

Description

Show 0 balance with decimals in classic denomination.
To be consistent with bitkit-ios and RN.

Preview

Screenshot 2025-11-14 at 11 11 49

QA Notes

synonymdev/bitkit-e2e-tests#46

@claude

claudeBot commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Code Review for PR #467

Summary

This PR fixes issue #342 by ensuring that zero balances display with proper decimal places (0.00000000) in classic BTC denomination, maintaining consistency with the iOS and React Native versions of Bitkit.


✅ Positive Aspects

  1. Correct Fix: The change properly addresses the root cause - the old pattern "###.########" would omit trailing zeros and all decimal places for zero values, while the new pattern "0.00000000" enforces all 8 decimal places.

  2. Clean Implementation: The refactoring improves code clarity by:

    • Using string repetition for the pattern: "0.${"0".repeat(CLASSIC_DECIMALS)}"
    • Explicitly setting min/max fraction digits to ensure consistent formatting
    • Removing the intermediate sats variable (minor cleanup)
  3. Consistency: Aligns the Android app with iOS and RN implementations, providing a unified UX across platforms.

  4. Uses Constants: Properly leverages the existing CLASSIC_DECIMALS constant.


📋 Code Quality & Best Practices

Good:

  • Follows Kotlin conventions
  • Uses DecimalFormat properly with explicit configuration
  • Code is readable and maintainable

Minor Suggestions:

  • The pattern string construction could be extracted to a constant for reusability if this pattern is needed elsewhere
  • Consider adding a KDoc comment explaining the formatting behavior for zero values

🐛 Potential Issues

None identified. The change is focused and correct.


⚡ Performance Considerations

No concerns. The change is minimal:

  • String concatenation happens once per call (negligible overhead)
  • Setting formatter properties is standard practice
  • No performance regression expected

🔒 Security Concerns

None. This is a pure formatting change with no security implications.


🧪 Test Coverage

Observation: There are no direct unit tests for formatToClassicDisplay() or formatToModernDisplay() extension functions.

Recommendation: Consider adding unit tests to cover edge cases like zero values, 1 BTC, and fractional values.

Note: I see you have E2E tests referenced (bitkit-e2e-tests #46), which is good for catching visual regressions, but unit tests would provide faster feedback during development.


✨ Overall Assessment

Status: LGTM with minor suggestion

This is a clean, focused fix that properly addresses the reported issue. The implementation is correct and the code quality is good.

Recommendation: Approve and merge, with optional follow-up to add unit tests for these formatting functions.

Nice work on the fix!

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR fixes the display of zero Bitcoin balance in classic denomination to show all 8 decimal places (e.g., "0.00000000" instead of "0"), ensuring consistency with the iOS and React Native versions of Bitkit.

  • Changed the decimal format pattern from "###.########" (which hides trailing zeros) to "0.00000000" (which enforces 8 decimal places)
  • Updated the formatter configuration to explicitly set minimum and maximum fraction digits to CLASSIC_DECIMALS (8)
  • Removed unnecessary intermediate variable sats for cleaner code

@claude

claudeBot commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Pull Request Review: Fix Classic BTC Display for Zero Balance

Overview

This PR fixes issue #342 where zero balances in Classic BTC denomination were displayed as 0 instead of 0.00000000. The fix ensures consistency with bitkit-ios and the React Native version.

Code Quality ✅

Strengths:

  • Clear and focused change that directly addresses the issue
  • Proper use of CLASSIC_DECIMALS constant consistently
  • Good code organization with explicit DecimalFormat configuration

Suggestions:

  1. Pattern construction (Currency.kt:112): The dynamic pattern generation could be defined as a constant for better reusability and performance
  2. Code consistency: Consider extracting format patterns as constants for maintainability

Potential Bugs/Issues ✅

No critical bugs identified, observations:

  1. Locale handling: The fix properly preserves locale-based decimal separators. Tests only verify Locale.US - consider testing European locales with comma decimal separators
  2. Pattern change from optional to required leading/trailing zeros is correct for the fix
  3. Removed unnecessary variable assignment improves clarity

Performance Considerations ✅

Positive impact:

  1. String concatenation for pattern could be pre-computed as constant
  2. DecimalFormat configuration is correct and prevents unnecessary allocations
  3. Minor: Creates new DecimalFormat per call - acceptable for typical usage

Security Concerns ✅

No security issues. Changes maintain type safety, no user input vulnerabilities, and use safe BigDecimal operations.

Test Coverage ⚠️

Good coverage, could be enhanced:

Existing tests:

  • formatToModernDisplay uses space grouping ✅
  • formatToModernDisplay handles zero ✅
  • formatToClassicDisplay always shows eight decimals ✅ (directly tests the fix)
  • formatToClassicDisplay converts sats to btc ✅

Recommended additions:

  1. Edge cases: maximum value, negative values
  2. Locale-specific tests for different decimal separators
  3. Trailing zeros for whole BTC values (100000000 sats = 1.00000000)
  4. Integration test for end-to-end display

Alignment with Issue #342

  • Zero balance displays as 0.00000000 in Classic denomination ✅
  • Consistent with bitkit-ios and React Native ✅
  • Screenshot shows expected behavior ✅

Additional Observations

  1. E2E Tests linked (bitkit-e2e-tests#46) - excellent
  2. ULong.formatToModernDisplay exists but no ULong.formatToClassicDisplay - consider for API completeness
  3. Consider adding KDoc comments explaining Modern vs Classic terminology

Summary

Recommendation: Approve with minor suggestions

Well-executed fix with minimal, focused changes and appropriate test coverage. Main suggestions:

  1. Extract format pattern as constant for performance/clarity
  2. Add edge-case tests (negative, locales, max values)
  3. Verify E2E tests pass

Great work on this fix! 🎉

@ovitrifovitrif left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👏🏻 Thanks for this nice work

@ovitrif
ovitrif merged commit 5ebe394 into masterNov 14, 2025
13 checks passed
@ovitrif
ovitrif deleted the fix/zero-denomination branch November 14, 2025 12:14
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Classic BTC denomination does not show correctly when 0 balance.

3 participants

@piotr-iohk@ovitrif
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: show 0 balance with decimals in classic denomination - #467

Merged
ovitrif merged 2 commits into
masterfrom
fix/zero-denomination
Nov 14, 2025
Merged

fix: show 0 balance with decimals in classic denomination#467
ovitrif merged 2 commits into
masterfrom
fix/zero-denomination

Conversation

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Closes#342.

Description

Show 0 balance with decimals in classic denomination.
To be consistent with bitkit-ios and RN.

Preview

Screenshot 2025-11-14 at 11 11 49

QA Notes

synonymdev/bitkit-e2e-tests#46

@claude

claudeBot commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Code Review for PR #467

Summary

This PR fixes issue #342 by ensuring that zero balances display with proper decimal places (0.00000000) in classic BTC denomination, maintaining consistency with the iOS and React Native versions of Bitkit.


✅ Positive Aspects

  1. Correct Fix: The change properly addresses the root cause - the old pattern "###.########" would omit trailing zeros and all decimal places for zero values, while the new pattern "0.00000000" enforces all 8 decimal places.

  2. Clean Implementation: The refactoring improves code clarity by:

    • Using string repetition for the pattern: "0.${"0".repeat(CLASSIC_DECIMALS)}"
    • Explicitly setting min/max fraction digits to ensure consistent formatting
    • Removing the intermediate sats variable (minor cleanup)
  3. Consistency: Aligns the Android app with iOS and RN implementations, providing a unified UX across platforms.

  4. Uses Constants: Properly leverages the existing CLASSIC_DECIMALS constant.


📋 Code Quality & Best Practices

Good:

  • Follows Kotlin conventions
  • Uses DecimalFormat properly with explicit configuration
  • Code is readable and maintainable

Minor Suggestions:

  • The pattern string construction could be extracted to a constant for reusability if this pattern is needed elsewhere
  • Consider adding a KDoc comment explaining the formatting behavior for zero values

🐛 Potential Issues

None identified. The change is focused and correct.


⚡ Performance Considerations

No concerns. The change is minimal:

  • String concatenation happens once per call (negligible overhead)
  • Setting formatter properties is standard practice
  • No performance regression expected

🔒 Security Concerns

None. This is a pure formatting change with no security implications.


🧪 Test Coverage

Observation: There are no direct unit tests for formatToClassicDisplay() or formatToModernDisplay() extension functions.

Recommendation: Consider adding unit tests to cover edge cases like zero values, 1 BTC, and fractional values.

Note: I see you have E2E tests referenced (bitkit-e2e-tests #46), which is good for catching visual regressions, but unit tests would provide faster feedback during development.


✨ Overall Assessment

Status: LGTM with minor suggestion

This is a clean, focused fix that properly addresses the reported issue. The implementation is correct and the code quality is good.

Recommendation: Approve and merge, with optional follow-up to add unit tests for these formatting functions.

Nice work on the fix!

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR fixes the display of zero Bitcoin balance in classic denomination to show all 8 decimal places (e.g., "0.00000000" instead of "0"), ensuring consistency with the iOS and React Native versions of Bitkit.

  • Changed the decimal format pattern from "###.########" (which hides trailing zeros) to "0.00000000" (which enforces 8 decimal places)
  • Updated the formatter configuration to explicitly set minimum and maximum fraction digits to CLASSIC_DECIMALS (8)
  • Removed unnecessary intermediate variable sats for cleaner code

@claude

claudeBot commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Pull Request Review: Fix Classic BTC Display for Zero Balance

Overview

This PR fixes issue #342 where zero balances in Classic BTC denomination were displayed as 0 instead of 0.00000000. The fix ensures consistency with bitkit-ios and the React Native version.

Code Quality ✅

Strengths:

  • Clear and focused change that directly addresses the issue
  • Proper use of CLASSIC_DECIMALS constant consistently
  • Good code organization with explicit DecimalFormat configuration

Suggestions:

  1. Pattern construction (Currency.kt:112): The dynamic pattern generation could be defined as a constant for better reusability and performance
  2. Code consistency: Consider extracting format patterns as constants for maintainability

Potential Bugs/Issues ✅

No critical bugs identified, observations:

  1. Locale handling: The fix properly preserves locale-based decimal separators. Tests only verify Locale.US - consider testing European locales with comma decimal separators
  2. Pattern change from optional to required leading/trailing zeros is correct for the fix
  3. Removed unnecessary variable assignment improves clarity

Performance Considerations ✅

Positive impact:

  1. String concatenation for pattern could be pre-computed as constant
  2. DecimalFormat configuration is correct and prevents unnecessary allocations
  3. Minor: Creates new DecimalFormat per call - acceptable for typical usage

Security Concerns ✅

No security issues. Changes maintain type safety, no user input vulnerabilities, and use safe BigDecimal operations.

Test Coverage ⚠️

Good coverage, could be enhanced:

Existing tests:

  • formatToModernDisplay uses space grouping ✅
  • formatToModernDisplay handles zero ✅
  • formatToClassicDisplay always shows eight decimals ✅ (directly tests the fix)
  • formatToClassicDisplay converts sats to btc ✅

Recommended additions:

  1. Edge cases: maximum value, negative values
  2. Locale-specific tests for different decimal separators
  3. Trailing zeros for whole BTC values (100000000 sats = 1.00000000)
  4. Integration test for end-to-end display

Alignment with Issue #342

  • Zero balance displays as 0.00000000 in Classic denomination ✅
  • Consistent with bitkit-ios and React Native ✅
  • Screenshot shows expected behavior ✅

Additional Observations

  1. E2E Tests linked (bitkit-e2e-tests#46) - excellent
  2. ULong.formatToModernDisplay exists but no ULong.formatToClassicDisplay - consider for API completeness
  3. Consider adding KDoc comments explaining Modern vs Classic terminology

Summary

Recommendation: Approve with minor suggestions

Well-executed fix with minimal, focused changes and appropriate test coverage. Main suggestions:

  1. Extract format pattern as constant for performance/clarity
  2. Add edge-case tests (negative, locales, max values)
  3. Verify E2E tests pass

Great work on this fix! 🎉

@ovitrifovitrif left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👏🏻 Thanks for this nice work

@ovitrif
ovitrif merged commit 5ebe394 into masterNov 14, 2025
13 checks passed
@ovitrif
ovitrif deleted the fix/zero-denomination branch November 14, 2025 12:14
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Classic BTC denomination does not show correctly when 0 balance.

3 participants

@piotr-iohk@ovitrif
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix: show 0 balance with decimals in classic denomination - #467

Merged
ovitrif merged 2 commits into
masterfrom
fix/zero-denomination
Nov 14, 2025
Merged

fix: show 0 balance with decimals in classic denomination#467
ovitrif merged 2 commits into
masterfrom
fix/zero-denomination

Conversation

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Closes#342.

Description

Show 0 balance with decimals in classic denomination.
To be consistent with bitkit-ios and RN.

Preview

Screenshot 2025-11-14 at 11 11 49

QA Notes

synonymdev/bitkit-e2e-tests#46

@claude

claudeBot commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Code Review for PR #467

Summary

This PR fixes issue #342 by ensuring that zero balances display with proper decimal places (0.00000000) in classic BTC denomination, maintaining consistency with the iOS and React Native versions of Bitkit.


✅ Positive Aspects

  1. Correct Fix: The change properly addresses the root cause - the old pattern "###.########" would omit trailing zeros and all decimal places for zero values, while the new pattern "0.00000000" enforces all 8 decimal places.

  2. Clean Implementation: The refactoring improves code clarity by:

    • Using string repetition for the pattern: "0.${"0".repeat(CLASSIC_DECIMALS)}"
    • Explicitly setting min/max fraction digits to ensure consistent formatting
    • Removing the intermediate sats variable (minor cleanup)
  3. Consistency: Aligns the Android app with iOS and RN implementations, providing a unified UX across platforms.

  4. Uses Constants: Properly leverages the existing CLASSIC_DECIMALS constant.


📋 Code Quality & Best Practices

Good:

  • Follows Kotlin conventions
  • Uses DecimalFormat properly with explicit configuration
  • Code is readable and maintainable

Minor Suggestions:

  • The pattern string construction could be extracted to a constant for reusability if this pattern is needed elsewhere
  • Consider adding a KDoc comment explaining the formatting behavior for zero values

🐛 Potential Issues

None identified. The change is focused and correct.


⚡ Performance Considerations

No concerns. The change is minimal:

  • String concatenation happens once per call (negligible overhead)
  • Setting formatter properties is standard practice
  • No performance regression expected

🔒 Security Concerns

None. This is a pure formatting change with no security implications.


🧪 Test Coverage

Observation: There are no direct unit tests for formatToClassicDisplay() or formatToModernDisplay() extension functions.

Recommendation: Consider adding unit tests to cover edge cases like zero values, 1 BTC, and fractional values.

Note: I see you have E2E tests referenced (bitkit-e2e-tests #46), which is good for catching visual regressions, but unit tests would provide faster feedback during development.


✨ Overall Assessment

Status: LGTM with minor suggestion

This is a clean, focused fix that properly addresses the reported issue. The implementation is correct and the code quality is good.

Recommendation: Approve and merge, with optional follow-up to add unit tests for these formatting functions.

Nice work on the fix!

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR fixes the display of zero Bitcoin balance in classic denomination to show all 8 decimal places (e.g., "0.00000000" instead of "0"), ensuring consistency with the iOS and React Native versions of Bitkit.

  • Changed the decimal format pattern from "###.########" (which hides trailing zeros) to "0.00000000" (which enforces 8 decimal places)
  • Updated the formatter configuration to explicitly set minimum and maximum fraction digits to CLASSIC_DECIMALS (8)
  • Removed unnecessary intermediate variable sats for cleaner code

@claude

claudeBot commented Nov 14, 2025

Copy link
Copy Markdown
Contributor

Pull Request Review: Fix Classic BTC Display for Zero Balance

Overview

This PR fixes issue #342 where zero balances in Classic BTC denomination were displayed as 0 instead of 0.00000000. The fix ensures consistency with bitkit-ios and the React Native version.

Code Quality ✅

Strengths:

  • Clear and focused change that directly addresses the issue
  • Proper use of CLASSIC_DECIMALS constant consistently
  • Good code organization with explicit DecimalFormat configuration

Suggestions:

  1. Pattern construction (Currency.kt:112): The dynamic pattern generation could be defined as a constant for better reusability and performance
  2. Code consistency: Consider extracting format patterns as constants for maintainability

Potential Bugs/Issues ✅

No critical bugs identified, observations:

  1. Locale handling: The fix properly preserves locale-based decimal separators. Tests only verify Locale.US - consider testing European locales with comma decimal separators
  2. Pattern change from optional to required leading/trailing zeros is correct for the fix
  3. Removed unnecessary variable assignment improves clarity

Performance Considerations ✅

Positive impact:

  1. String concatenation for pattern could be pre-computed as constant
  2. DecimalFormat configuration is correct and prevents unnecessary allocations
  3. Minor: Creates new DecimalFormat per call - acceptable for typical usage

Security Concerns ✅

No security issues. Changes maintain type safety, no user input vulnerabilities, and use safe BigDecimal operations.

Test Coverage ⚠️

Good coverage, could be enhanced:

Existing tests:

  • formatToModernDisplay uses space grouping ✅
  • formatToModernDisplay handles zero ✅
  • formatToClassicDisplay always shows eight decimals ✅ (directly tests the fix)
  • formatToClassicDisplay converts sats to btc ✅

Recommended additions:

  1. Edge cases: maximum value, negative values
  2. Locale-specific tests for different decimal separators
  3. Trailing zeros for whole BTC values (100000000 sats = 1.00000000)
  4. Integration test for end-to-end display

Alignment with Issue #342

  • Zero balance displays as 0.00000000 in Classic denomination ✅
  • Consistent with bitkit-ios and React Native ✅
  • Screenshot shows expected behavior ✅

Additional Observations

  1. E2E Tests linked (bitkit-e2e-tests#46) - excellent
  2. ULong.formatToModernDisplay exists but no ULong.formatToClassicDisplay - consider for API completeness
  3. Consider adding KDoc comments explaining Modern vs Classic terminology

Summary

Recommendation: Approve with minor suggestions

Well-executed fix with minimal, focused changes and appropriate test coverage. Main suggestions:

  1. Extract format pattern as constant for performance/clarity
  2. Add edge-case tests (negative, locales, max values)
  3. Verify E2E tests pass

Great work on this fix! 🎉

@ovitrifovitrif left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👏🏻 Thanks for this nice work

@ovitrif
ovitrif merged commit 5ebe394 into masterNov 14, 2025
13 checks passed
@ovitrif
ovitrif deleted the fix/zero-denomination branch November 14, 2025 12:14
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Classic BTC denomination does not show correctly when 0 balance.

3 participants

@piotr-iohk@ovitrif